アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のVIEWをPROCEDURE内で使用しています。

CREATE OR REPLACE VIEW VW_KAIIN
(CODE,NAME,TEL,STARTYMD)
AS
SELECT * FROM KAIIN
WHERE STARTYMD <= TO_CHAR(SYSDATE,'YYYYMMDD')

※STARTYMDには有効な開始日付が入ります。

条件部分でSYSDATEではまずいことになり、
特定の日付を指定しなければならなくなりました。


VIEW自体にパラメータ渡しはできないということで、

CREATE OR REPLACE PROCEDURE TABLE_B_UPDATE
(I_YYYY IN TABLE_A.YYYYY%TYPE,
I_MM IN TABLE_A.MM%TYPE,
I_DD IN TABLE_A.DD%TYPE,)

PROCEDURE内でI_YYYY、I_MM、I_DDを条件に変更した
VIEWを動的に作成して、処理をしたいのですが、
こういった事は可能でしょうか?

そのまま書いてみましたが、CREATE部分でエラーが出てしまい、コンパイルできませんでした。

もし不可能である場合は、代替案をご教授いただけるとありがたいです。

どうかよろしくお願いします。

A 回答 (2件)

プロシージャ内でも動的SQLを使えばDDLの実行はできます。

試してみてください。
set serveroutput on
declare
w_str varchar2(1000);
begin
--TABLE作成
execute immediate 'create table test_table(val varchar2(100))';
--データ投入
execute immediate 'insert into test_table values (:val)' using 'テスト';
--VIEW作成
execute immediate 'create view test_view as select * from test_table';
--VIEWからSELECT
execute immediate 'select val from test_view' into w_str;
--結果出力
dbms_output.put_line(w_str);
--TABLE,VIEW削除
execute immediate 'drop table test_table purge';
execute immediate 'drop view test_view';
exception
when others then raise;
end;
/
set serveroutput off

ただ、今回の質問はkouta77さんのおっしゃるとおりVIEW動的に作成する意味がよくわかりませんね。
やりたいこと、目的を明確にしてもらうと何かアドバイスできるかもしれません。

この回答への補足

元々、前任者が作っておったもので、
VIEW自体は、他のプログラムで呼び出したり、共通で使っているのは
間違いないと思います。

私自身、オラクルやPLSQLに触れるのが初めてなものですから、
VIEW自体でパラメータが使えたら一番よかったのですが。

プロシージャ内でVIEWの項目が基本軸として使用されており、
安易に、既存のVIEWのコピーを、プロシージャ内のパラメータを使用して、もうひとつ作ったら、いけるかなぁ、と思ってやってみたところ、ダメでしたので、質問させていただきました。

上記方法ためさせていただきます。
ありがとうございます。

補足日時:2011/04/12 19:24
    • good
    • 0
この回答へのお礼

上記方法でやりたいことが作成できました。
VIEW作成以外もご紹介いただき感謝です。
ありがとうございました。

お礼日時:2011/04/13 17:58

プロシージャ―内でCREATE文(DDL文)は記述できません。




そもそもVW_KAIINをどう使いたいのですか?
いちいちVIEWにする必要はなくて、プロシージャ―内でデータをSELECTする時に条件文を付けるのでは
駄目なんですか?
この質問文を見る限りではVIEWにする意図が分かりません。

この回答への補足

他のプロシージャや、プログラム内からも、共通で使いたいので、
VIEWにしております。

まだ、PLSQL自体、見始めて間もないもので、見当違いことを言ってたらすいません。

補足日時:2011/04/12 18:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!