• ベストアンサー

ストアドファンクションの戻り値をテーブルに・・

SQL/PLUSにて作成したファンクションの戻り値で返ってきた文字列をテーブル名として使用するにはどうすればよいのでしょうか?? まず以下のようにSQL/PLUSにてFUNCTIONを作成しました。 create or replace function FuncXXXXX (inA varchar2) return varchar2 is OutA varchar2; begin select MAX(table_name) into outA from all_tables where table_name like inA || '%'; return outA end; / それを以下省略ですが、テーブルでコールしようとするとエラー(ORA-00905:キーワードがありません)が発生します。このような使い方はできないのでしょうか? select   ・   ・ from AAAA inner join FuncXXXXX(inA) ※execute FuncXXXXX(inA)でも同様 on   ・   ・ 申し訳ありませんが宜しくお願いします。

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

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.3

このくらいならSQL*Plusなら、ストアドを使わなくても可能です。 test.sql ----------- set line 150 set pages 150 column max_tab_name NEW_VALUE MAXTAB select MAX(table_name) AS max_tab_name from all_tables where table_name like upper('&&1%'); select * from &&MAXTAB; exit ----------- $ sqlplus scott/tiger @test emp SQL*Plus: Release 11.1.0.6.0 - Production on 火 12月 9 18:35:51 2008 Copyright (c) 1982, 2007, Oracle. All rights reserved. Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options に接続されました。 旧 3: where table_name like upper('&&1%') 新 3: where table_name like upper('emp%') MAX_TAB_NAME ------------------------------------------------------------ EMP_HIST 旧 1: select * from &&MAXTAB 新 1: select * from EMP_HIST EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEL_DATE ---------- -------------------- ------------------ ---------- -------- ---------- ---------- ---------- -------- 7369 SMITH CLERK 7902 80-12-17 800 20 08-02-01

その他の回答 (3)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

もしかしたら、SQLPlus限定の話でしたか? (そんな気がしてきました) それでよければ#3さんのように置換変数を使ってやっていただければいいかと思います。 その意味では蛇足ですが、一旦テーブルに受ける方の例を書いておきます。 CREATE OR REPLACE PROCEDURE POP_WORK(inA VARCHAR2) IS outA VARCHAR2(100); cntA VARCHAR2(100); BEGIN SELECT MAX(TABLE_NAME) INTO outA FROM ALL_TABLES WHERE TABLE_NAME LIKE UPPER(inA) || '%'; SELECT COUNT(*) INTO cntA FROM ALL_TABLES WHERE TEMPORARY='Y' AND TABLE_NAME='GTT_' || outA; IF (cntA > 0) THEN DBMS_OUTPUT.PUT_LINE('GTT_' || outA || ' ALREADY EXIST'); ELSIF (outA IS NOT NULL) THEN EXECUTE IMMEDIATE ('CREATE GLOBAL TEMPORARY TABLE GTT_' || outA || ' ON COMMIT PRESERVE ROWS' || ' AS (SELECT * FROM ' || outA || ')'); DBMS_OUTPUT.PUT_LINE('GTT_' || outA); ELSE DBMS_OUTPUT.PUT_LINE('NO TABLE'); END IF; END; / プロシージャが作成されました。 SQL>SET SERVEROUT ON SQL>EXEC POP_WORK('TBL'); GTT_TBLC PL/SQLプロシージャが正常に完了しました。 SQL>SELECT * FROM GTT_TBLC; SQL>TRUNCATE TABLE GTT_TBLC; SQL>DROP TABLE GTT_TBLC;

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

テーブル名の最大値を収録すること自体はファンクションで可能ですが、その戻り値をSQL文でテーブルとして使用することはできません。 カラムもできないはずです。 動的SQLであれば両方とも可能ですが、PL/SQLブロック内の処理になるため、一旦テーブルに受けるか、カーソルを回して書きだすかしないと値を受け取ることができないと思います。

ryozyryozy
質問者

お礼

ご回答ありがとうございます。 テーブルにかくとは一旦ビュー等作成するということでしょうか? また「カーソルを回して書き出す」とは具体的にどういうことでしょうか?初歩的質問で申し訳ありませんが宜しくお願いします。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

カラム名、テーブル名を動的に設定することはできません。 従って、そのアプローチはできないです。 そこから先は質問者さんがどういう環境で何をしようとしているかによりますね。 (アプリ側でコントロールするのか、テーブルや一時テーブルを経由するのか、動的SQLでカーソルフェッチするのか、SQL/Plus限定で置換変数を使うのか、など)

ryozyryozy
質問者

お礼

ご回答ありがとうございます。 テーブル名にtablename_yyyymmが複数あり、それの最大値を取得したいだけなのですが、ストアドファンクションでは無理なのでしょうか? 尚バージョンは9iです。 ちなみにテーブル名は今回初めて試みましたがカラムも動的には無理でしょうか?以前サンプルで見たような気がしましたが… 申し訳ないですが宜しくお願いします。