Oracle PL/SQLのコマンド終端子は?
- Oracle PL/SQLのコマンド終端子は「;」か「/」のどちらでも使用することができます。どちらを使用するかは個人の好みや統一ルールによるものです。
- OracleでSQLを書く際には、コマンドの終わりにセミコロン(;)かスラッシュ(/)を書きます。どちらの終端子を使うかは好みや統一ルールによって異なります。
- Oracle PL/SQLでは、コマンドの終端子としてセミコロン(;)またはスラッシュ(/)を使用することができます。どちらを使うかは統一ルールや個人の環境によりますが、どちらを使っても同じ結果が得られます。
- ベストアンサー
oracle pl/sql のコマンド終端子は「;」?「/」?
oracleのsqlを書くときにコマンドの終わりに 「;」を書きますか? 「/」を書きますか? 例えば ===== sample1.sql ===== CREATE TABLE TB1 (IT1 VARCHAR(1)) ; COMMENT ON TABLE TB1 IS 'TB1のコメント' ; ===== sample1.sql ===== でも ===== sample2.sql ===== CREATE TABLE TB1 (IT1 VARCHAR(1)) / COMMENT ON TABLE TB1 IS 'TB1のコメント' / ===== sample2.sql ===== でも、同じ動きをしますが、どちらを使いますか? すべて「;」 すべて「/」 使い分けがある。 どちらでも良いが統一するに越したことはない。 好き嫌いのアンケートではありません。 人に聞かれた時に説明できる理由が欲しいです。 以上、よろしくおねがいします。
- webuser
- お礼率85% (1391/1635)
- Oracle
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SQL文の終端は「;」です。 「/」は、 SQLバッファ内のSQL文を実行する という意味です。 たとえば、 SQL*PLUSを実行した直後に SQL> /[Return] とするとエラーになるはずです。 「;」の場合は、エラーになりません。 また、 SQL> SELECT SYSDATE FROM DUAL[Return] SQL> ;[Return] SQL> /[Return] SQL> SELECT SYSDATE FROM DUAL[Return] SQL> /[Return] SQL> ;[Return] の動作の違いも確認してみてください。
その他の回答 (1)
- ese_ee
- ベストアンサー率48% (68/139)
どちらでも構いません。 なお、私なら、下記のように書きます。 ===== sample3.sql ===== CREATE TABLE TB1 (IT1 VARCHAR(1)); COMMENT ON TABLE TB1 IS 'TB1のコメント'; セミコロンの場合は、 このように1行で書けますが、 「/」では書けません。 また、ストアドプロシージャを書けば判りますが、 CREATE PROCEDURE 名前 IS ~省略~; BEGIN ~省略~ END; / こういうのは「;」「/」の使い分けが必要です。
関連するQ&A
- sqlplusで実行したSQLの結果をシェルで判定する方法
sqlplusから実行したSQLの結果をシェルで判定するにはどうすれば良いですか? SQLコードかなんらかのステータスコードを拾いたいのですが。。 #!/bin/sh # sample1.sh top sqlplus user/pass@db @sqlfile.sql # ここにステータス判定を入れたい # sample1.sh bottom ----- sqlfile.sql ----- create table tb1 (it1 varchar(1) ); quit; ----- sqlfile.sql -----
- ベストアンサー
- Oracle
- MySQL show create table ~と同じOracleでのSQL文
Mysqlでテーブルを作成するステートメントを表示するSQL文 ” SHOW CREATE TABLE テーブル名”に該当する、oracleの SQL文ってありますか?
- 締切済み
- Oracle
- PL/SQLでエラー
PL/SQLの使用方法を検討しており、下記のようにサンプルを作成しました。 //1. 宣言部 create or replace package Pac is procedure Pro1(p1 in varchar2); end; / パッケージが作成されました //2. 本体 create or replace package body Pac is procedure Pro1(p1 in varchar2) is tempdate DATE; begin select to_char(sysdate, 'yyyy/mm/dd') INTO tempdate from dual; DBMS_OUTPUT.PUT_LINE('引数は' || p1 || 'です。'); DBMS_OUTPUT.PUT_LINE('日付は' || tempdate || 'です。'); end; end; / パッケージ本体が作成されました //3. 実行 execute Pac.Pro1('a'); // エラー内容 行1でエラーが発生しました。: ORA-00900: invalid SQL statement SQLPlusより、上記の[1. 宣言部]でパッケージを作成し、[2. 本体]で本体部分を作成しました。 その後、[3. 実行]を実施しましたが、 エラーが出力されて実行されません。 何がいけないのかお気づきの点がございましたら、 よろしくお願いします。
- 締切済み
- Oracle
- SQL*Loaderをダイレクトモードで実行
するにはどうしたらいいのでしょうか? 例えば以下の場合にダイレクトモードでSQL*Loaderするにはどうしたらいいのでしょうか? sqlldr sato/secret control=x.ctl ただし x_table: create table x_table(i number,s varchar(99)); x.ctl: LOAD DATA INFILE 'x.csv' APPEND INTO TABLE x_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( i,s ) x.csv: 1,"it is iti." 2,"it is ni." 3,"it is san."
- ベストアンサー
- Oracle
- PL/SQLのエラーについて
こんばんは。PL/SQLのエラーについて質問させて頂きます。 現在、Oracle8.1.7のデータベースを使用したオラクルのE-business Suiteという人事系システムで開発をしています。 そこで、SQL*Plusを使用してPL/SQLのパッケージをコンパイルしたところ、パッケージ仕様部も本体部もコンパイルのエラーは出なかったのですが、E-business SuiteにPL/SQLを設定し、動作させようとしたら、下記のようなエラーが発生しました。 -------------------------------------------------------------------- FDPSTP 内のOracleエラー 6550 原因: ORA-06550: 行 1、列 7: PLS-00221: 'ZT_TYOUHYOU_HENSEI_PKG'がプロシージャではないか、または未定義です。 ORA-06550: 行 1、列 7: PL/SQL: Statement ignored が原因で FDPSTP に失敗しました。 --------------------------------------------------------------------- また、作成したPL/SQLパッケージの仕様部は下記のとおりです。 -------------------------------------------------------------------- CREATE OR REPLACE PACKAGE APPS.ZT_TYOUHYOU_HENSEI_PKG AS FUNCTION get_henseihyo_kbn (i_grade IN VARCHAR2,o_hensei_kbn OUT VARCHAR2) RETURN NUMBER; <・・・・・中間部分は省略・・・・・> PROCEDURE main_shori (p_process_date IN VARCHAR2, p_location IN VARCHAR2); END ZT_TYOUHYOU_HENSEI_PKG; -------------------------------------------------------------------- 原因だと思われる心当たりの部分も探してみたのですが、このエラーの意味は何なのか、原因はどこにあるのか分かりません。 どなたかお判りの方、御回答よろしくお願い致します。
- ベストアンサー
- その他(データベース)
- PL/SQLでの処理について
キーの異なる2つのトランザクションテーブルA,Bに マスタCの値を引っ張ってきて各A,B埋める処理を、テーブル名を引数にPL/SQLのプロシージャにしたいのですが、良い方法はありますか? 以下のイメージです。 <TABLE A> KEY_A C_CD C_VALUE -----+----+------- 1 3 2 3 3 1 <TABLE B> KEY_B C_CD C_VALUE -----+----+------- 1 3 2 3 3 1 <TABLE C> C_CD C_VALUE ----+-------- 1 A 2 B 3 C SQL>EXECUTE foo('A'); <TABLE A> KEY_A C_CD C_VALUE -----+----+------- 1 3 C 2 3 C 3 1 A SQL>EXECUTE foo('B'); <TABLE B> KEY_B C_CD C_VALUE -----+----+------- 1 3 C 2 3 C 3 1 A <処理イメージ> CREATE OR REPLACE PROCEDURE FOO(TNAME VARCHA2) IS c_cd NUMBER; C1 INTEGER; SQL1 VARCHAR2(2000); I INTEGER; BEGIN SQL1 := 'SELECT c_cd FROM ' || tname; C1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(C1, SQL1, DBMS_SQL.V7); DBMS_SQL.DEFINE_COLUMN(C1, 1, c_cd); LOOP IF DBMS_SQL.FETCH_ROWS(C1) > 0 THEN DBMS_SQL.COLUMN_VALUE(C1, 1, c_cd); UPDATE tname set value = c_cd; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↑ここの部分をうまくかけないでしょうか? ELSE EXIT; END IF; END LOOP; end /
- ベストアンサー
- その他(データベース)
- comment on columnについてわからなくて困っています。
CREATE TABLE の中で各列にコメントをつける方法はありますか? できなければ、以下の方法では、 ORACLE Express EditionのSQL実行で、 下記のコメントを一行ずつしか実行できないのですが、 1回で実行する方法はありますか? □作りたいテーブル CREATE TABLE DB_USER_MST ( DB_USER_ID VARCHAR2(5) NOT NULL, DB_PASSWORD VARCHAR2(5), DB_NAME VARCHAR2(30), DB_POSTCODE NUMBER(7), DB_PREFECTURE_ID NUMBER(2), DB_ADDRESS VARCHAR2(100), DB_TELEPHONE NUMBER(11), DB_SEX NUMBER(1), PRIMARY KEY (DB_USER_ID) ) □付けたいコメント COMMENT ON COLUMN DB_USER_MST.DB_USER_ID IS 'お客様ID' COMMENT ON COLUMN DB_USER_MST.DB_PASSWORD IS 'パスワード' COMMENT ON COLUMN DB_USER_MST.DB_NAME IS 'お名前' COMMENT ON COLUMN DB_USER_MST.DB_POSTCODE IS '郵便番号' COMMENT ON COLUMN DB_USER_MST.DB_PREFECTURE_ID IS '県ID' COMMENT ON COLUMN DB_USER_MST.DB_ADDRESS IS 'ご住所' COMMENT ON COLUMN DB_USER_MST.DB_TELEPHONE IS 'お電話番号' COMMENT ON COLUMN DB_USER_MST.DB_SEX IS '性別'
- ベストアンサー
- Oracle
- 【PL/SQL】SQL文が長すぎてSELECTできない
oracle9iのpl/sqlでSELECT文を発行し 取得したカーソルを返す処理をしています。 where句が動的になる為 実行するSQL文が長くなり ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました のエラーが発生します。 そこで、SQL文の部分をCLOB型にしたり SQL文を「||」でつなげたり してみましたが、どちらもエラーになりました。 長すぎるSQL文を実行するには どうしたらよいでしょうか? 以下ソースです。(左側の数字は行数です) ----------------------------------- 1 PROCEDURE テスト(O_カーソル IN OUT 情報カーソル) IS 2 TYPE curType IS REF CURSOR; 3 tmpCur curType; 4 sqlStr VARCHAR2(32767); 5 6 7 BEGIN 8 9 sqlStr := 'SELECT ' 10 sqlStr := sqlStr || 'A,B ' 11 sqlStr := sqlStr || 'FROM' <<省略>> 12 OPEN tmpCur FOR sqlStr ←エラー発生 13 O_カーソル := tmpCur; --取得したカーソルを返す 14 END テスト; ----------------------------------- (1)SQL文をCLOB型にしてみる:コンパイルエラー 4 sqlStr CLOB (2)SQL文を「||」でつなげてみる:文字列バッファが小さすぎますでエラー Dim sqlStr1 VARCHAR2(32767); Dim sqlStr2 VARCHAR2(32767); Dim sqlStr3 VARCHAR2(32767); <<省略>> 12 OPEN tmpCur FOR (sqlStr1 || sqlStr2 || sqlStr3 <<省略>> )
- ベストアンサー
- Oracle
- 【PL/SQL】LOOPした動的SQLにてFETCHができない
OracleのPL/SQLで FOR .. LOOP内にて動的SQLを使い SELECTしてきた値を順次FETCHして配列に格納していきたいのですが、 LOOPの1件目のみFETCHがされて2件目以降は全てNULLになってしまいます。SQL文は間違っていません。DBMS_SQL.LAST_ROW_COUNTで1件以上の検索結果があることも確認済みです。 なぜでしょう?教えて下さい! EXECUTE IMMEDIATEをLOOP内で使うことに問題あり? 簡略化した例です。p_noにはすでに文字列格納済みと見てください。 txtsql VARCHAR2(1000); -- 動的SQL mkin INTEGER; fornum1 INTEGER; max_count INTEGER; -- ループされる最大件数 TYPE type_mkin IS TABLE OF NUMBER(10) INDEX BY BINARY_INTEGER; TYPE type_pno IS TABLE OF CHAR(10) INDEX BY BINARY_INTEGER; mkin type_mkin; p_no type_pno; BEGIN FOR fornum1 IN 1 .. max_count LOOP txtsql := 'SELECT SUM(TPSV_NO) ' || ' FROM ACTV || ' WHERE PRI_NO= ' || p_no(fornum1); EXECUTE IMMEDIATE txtsql INTO mkin(fornum1); DBMS_OUTPUT.PUT_LINE(mkin(fornum1)); END LOOP; END;
- 締切済み
- Oracle
- SQL(oracle)でご助言いただきたく。
oracle sql developer(Version 1.5.1 )を使用してsqlを叩いてもエラーが出てくるので ご助言いただきたく思います。 update table set comment = '新規' where code = '111'; 上記のSQL文を実行すると、ora-01747のエラーが出ます。 commentという名前のカラムですが、 ここを別のカラムmailにして実行するとうまくいきます。 カラムの型は以下の通りです。 comment : varchar2(500 BYTE) mail : varchar2(128 BYTE) 唯一気がかりなのは、通常ならば update,set,where だけが濃い青色で表示されるのですが、 commentもなぜか濃い青色で表示されます。 (mailは濃い青色になりません。) ご助言の程、宜しくお願い致します。
- ベストアンサー
- Oracle
補足
なるほど、 そうした場合、上記の例なら sample1.sql sample2.sql どちらで記述するのが正解ですか? あるいは ===== sample3.sql ===== CREATE TABLE TB1 (IT1 VARCHAR(1)) / ; COMMENT ON TABLE TB1 IS 'TB1のコメント' / ; ===== sample3.sql ===== が正解ですか?