• 締切済み

PL/SQLでFROM句に変数を使いたい

msystemの回答

  • msystem
  • ベストアンサー率42% (79/186)
回答No.3

PL/SQLで、DROP文等のDDL文を使いたいときは、DBMS_SQLパッケージを使用する必要があります。テーブル名を変数にしたいときも同じことです。 DBMS_SQLパッケージは、PL/SQLパッケージの中では割とよく使うパッケージなので、多くの情報が得られると思います。 調べてみてください。

Hk2001
質問者

お礼

アドバイスありがとうございます。 質問中でも書きましたが DBMS_SQLパッケージでの実行は、動作確認済みです。 文章内容から推測すると「できない」ということになるのでしょうか? ない頭なりに考えて、 UTL_FILE.PUT_LINEを使いPL/SQLの関数を作成してしまえばとも 考えましたが、結局 コンパイル時に解析しなくてはならず一緒ですね。

関連するQ&A

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。

  • PL/SQLでのSQL文法

    こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。

  • PL/SQLでテーブル名に変数を使いたい

    下記のようにV_TABLE_NAMEに不定のテーブル名で使用したい ご存知の方は教えて頂けないでしょうか?V_TABLE_NAMEに取得したテーブルをセットし、データの件数を取得するPL/SQL CURSOR C_CUR IS SELECT COUNT (*) FROM V_TABLE_NAME; BEGIN for ・・・・・ loop ・・・  ・・・ V_TABLE_NAME := GET_TABLE;  OPEN C_CUR;  FETCH C_CUR into w_count; CLOSE C_CUR; end loop;

  • 動的SQLのfetch

    動的SQLのfetch やりたいこととしては、下記の(1)のような動的SQLをfetchなりforなりで まわしたいのですがどうしたらいいのでしょうか? よろしくお願いします。 for c_rec in (select table_name from user_tables) loop   v_sql := 'select * from '||rowtbl.table_name; ・・・(1)   ~ 省略 ~ end loop;

  • PL/SQLのエラー処理について

    PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin      insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。

  • PL/SQL カーソルのFROM句にカーソル

    もしご存知の方がいればお教えください。 ORACLE PL/SQLで CURSOR cur_a AS SELECT a FROM TBLA とカーソルを宣言し そのカーソルを他のカーソルで 使用することは可能でしょうか? 以下のような感じで CURSOR cur_B AS SELECT b FROM TBLB,cur_a ご存知の方が居たら どのようなSELECT文を 書けばよいかお教えください よろしくお願いいたします

  • PL/SQLのDELETE文について

    PL/SQLでDELETE文を書こうとしているのですが、 文法がわかりません。。。 分かる方がおられましたら、教えてくださいm(_ _)m 今、TABLE1を削除したいのですが、条件がいろいろあって、 以下のように書いてみたのですがダメでした。 こういう書き方は、できないんでしょうか・・・。 削除条件は、TABLE2に存在し、かつ、TABLE2のTENSUが0のもので、 TABLE3が存在しないものです。 DELETE TABLE1 FROM TABLE1 ,TABLE2 ,TABLE3 WHERE TABLE1.ID = TABLE2.ID AND TABLE2.TENSU = 0 AND Not Exists (SELECT TABLE3.ID FROM TABLE3 WHERE TABLE3.ID = TABLE2.ID) 説明が下手なので、うまく、伝わっているか、心配なのですが・・・、 よろしくお願いします。

  • 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 /

  • 変数が選択リストにありません

    変数が選択リストにありません 下記のコードを実行すると「変数が選択リストにありません」というエラーが出てしまいます。 SELECT文とFETCHのINTOの変数の個数が一致していない場合にこのエラーは出るということらしいのですが、問題ないように思うのです。 下記コードで何が問題になっているのか教えてください。 よろしくお願いします。 set serveroutput on; declare -- 各テーブルの全カラムを取得 cursor curcol (p_tblname user_tables.table_name%type) is select COLUMN_NAME,DATA_TYPE from user_tab_columns where table_name = p_tblname ; v_sql varchar2(1000); -- SQL文 v_col varchar2(1000); -- カラム名 v_val varchar2(1000); -- 取得データ v_tblname varchar2(20); -- テーブル名 v_RstExec integer; v_CursorID integer; begin v_col := ''; v_tblname := 'sample'; -- 取得テーブルのカラムを取得 for rowcol in curcol(v_tblname) loop -- 取得カラムをCSV形式に変換 if v_col is null then v_col := rowcol.COLUMN_NAME; else v_col := v_col||'||'',''||'||rowcol.COLUMN_NAME; end if; end loop; dbms_output.put_line(v_col); -- SQL作成 v_sql := 'select '||v_col||' from '||v_tblname; v_CursorID := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.NATIVE); v_RstExec := DBMS_SQL.EXECUTE(v_CursorID); LOOP IF DBMS_SQL.FETCH_ROWS(v_CursorID) = 0 THEN EXIT; END IF; DBMS_SQL.COLUMN_VALUE(v_CursorID, 1, v_val); DBMS_OUTPUT.PUT_LINE(v_val); END LOOP; DBMS_SQL.CLOSE_CURSOR(v_CursorID); end; /

  • 無名ブロック内でのDDL実行について

    環境は Linux + oracle 10g R2です。 簡単な無名プロシージャを書いていてはまって しまいました。 分かる方でしたら、あっというまに指摘していただけそうなので こちらに質問しました。 無名ブロック内で以下の事を行いたいのですが、うまく動作を確認できません。 ※以下は意味の無い処理となっていますが、今回説明用に短くしてみました。 ◇実現したい事 1.CREATE TABLE文の実行 (ここではEX01テーブルを作成します) 2.CREATE したテーブルにたいしてINSERT 3.CREATE したテーブルのDROP ◇私の実行結果 $ sqlplus scott/tiger@orcl SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 -- 私の思いでは以下のプロシージャは正常に動作するのでは? -- と思うのですが、以下の通りエラーとなってしまいます。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 4 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 5 END; 6 / INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); * 行3でエラーが発生しました。: ORA-06550: 行3、列13: PL/SQL: ORA-00942: 表またはビューが存在しません。 ORA-06550: 行3、列1: PL/SQL: SQL Statement ignored -- -- なので、処理を分割して行ってみました。 -- まずはCREATE TABLEのみ -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- CREATE TABLEは正常に動作したようです。 -- SQL> INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 1行が作成されました。 -- -- INSERT文も正常に動作したようです。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- なんとDROP TABLEも正常に動作したようです。 -- SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 SQL> そうなんです。3行まとめて記載するとエラーとなるのですが、 上記の通りそれぞれ分けて実行すると正常に動作するのです。 これはどこが悪いのでしょうか? 情けない事に、今日の午後はこれでほとんどつぶれてしまいました。 どなたか助けてください。 以上よろしくお願いします。