0

私の目標は、後で dbms_sql によって使用されるバインド値と引数を含むテーブルを保持することです。以下の pl/sql の例は基本的なものです。その目的は、前のループ オブジェクトから値を呼び出す際に発生している問題を説明することです。

テーブルaccount_tableはアカウント情報を保持します

CREATE TABLE account_table (account number, name varchar2(100)));

INSERT INTO mytest 
    (account, name) 
VALUES 
    (1 ,'Test');
COMMIT;

テーブルMYTESTはバインド情報を保持します

CREATE TABLE mytest (bind_value varchar2(100));

INSERT INTO mytest (bind_value) VALUES ('i.account');
COMMIT;



DECLARE
  v_sql VARCHAR2(4000) := NULL;
  v_ret VARCHAR2(4000) := NULL;
BEGIN
  FOR I IN (
    SELECT account
    FROM account_table
    WHERE ROWNUM = 1
  ) LOOP

    FOR REC IN (
      SELECT *
      FROM mytest
    ) LOOP

      v_sql := 'SELECT ' || rec.bind_value || ' FROM dual';
      EXECUTE IMMEDIATE v_sql INTO v_ret;

      dbms_output.put_line ('Account: ' || v_ret);
    END LOOP;

  END LOOP;
END;
/

名前i.accountを保存できず、後でそのオブジェクトの値を使用できません。私の考えは、NDS を使用することでした。ただし、v_sqlの値は問題ないように見えますが (「Select i.account from dual」と表示されます)、無効な識別子の例外がi.accountで発生します。オブジェクトの値を取得する方法はありますか? Oracle 11g2 を使用しています。ありがとう!

4

2 に答える 2

1

いつも同じ where 句で同じテーブルにアクセスしようとしていますが、毎回異なる列を探していますか? もしそうなら、あなたはこれを行うことができます:

p_what_I_want := 'ACCOUNT';
--
SELECT decode(p_what_I_want
               ,'ACCOUNT', i.account
               , 'OTHER_THING_1', i.other_thing_1
               , 'OTHER_THING_2', i.other_thing_2
               , 'OTHER_THING_1', i.default_thing) out_thing
INTO l_thing
FROM table;

上記のステートメントは動的ではありませんが、オンデマンドで別の列を返します...

于 2013-03-08T06:59:29.950 に答える