Oracle PL/SQLのコマンド終端子は?

このQ&Aのポイント
  • 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 ===== でも、同じ動きをしますが、どちらを使いますか? すべて「;」 すべて「/」 使い分けがある。 どちらでも良いが統一するに越したことはない。 好き嫌いのアンケートではありません。 人に聞かれた時に説明できる理由が欲しいです。 以上、よろしくおねがいします。

  • Oracle
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • ese_ee
  • ベストアンサー率48% (68/139)
回答No.1

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] の動作の違いも確認してみてください。

webuser
質問者

補足

なるほど、 そうした場合、上記の例なら sample1.sql sample2.sql どちらで記述するのが正解ですか? あるいは ===== sample3.sql ===== CREATE TABLE TB1 (IT1 VARCHAR(1)) / ; COMMENT ON TABLE TB1 IS 'TB1のコメント' / ; ===== sample3.sql ===== が正解ですか?

その他の回答 (1)

  • ese_ee
  • ベストアンサー率48% (68/139)
回答No.2

どちらでも構いません。 なお、私なら、下記のように書きます。 ===== 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 -----

  • MySQL show create table ~と同じOracleでのSQL文

    Mysqlでテーブルを作成するステートメントを表示するSQL文 ” SHOW CREATE TABLE テーブル名”に該当する、oracleの SQL文ってありますか?

  • 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. 実行]を実施しましたが、 エラーが出力されて実行されません。 何がいけないのかお気づきの点がございましたら、 よろしくお願いします。

  • 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."

  • 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 '性別'

  • 【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 <<省略>> )

  • 【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;

  • 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は濃い青色になりません。) ご助言の程、宜しくお願い致します。