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

动态 SQL 将没有 PL/SQL 块的上下文。您不能在动态 SQL 语句中使用在 PL/SQL 块中定义的标识符。因此,您不能引用i.account和引用您在动态 SQL 语句之外定义的循环。当然,您可以动态生成整个 PL/SQL 块,但动态 PL/SQL 通常是一种非常糟糕的方法——很难正确处理这类事情。

但是,如果您尝试使用 的值i.account,则可以执行类似的操作

v_sql := 'SELECT :1 FROM dual';
EXECUTE IMMEDIATE v_sql
   INTO v_ret
  USING i.account;

i.account但是,如果您想从表中获取字符串,这似乎对您没有帮助。

于 2013-03-07T22:28:09.367 回答
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 回答