我的目标是保留一个包含绑定值和参数的表,这些值和参数稍后将被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的值看起来很好(它将读为“Selecti.account from dual"),但是在 i.account 上会出现无效标识符的例外情况。有什么方法可以得到对象的值吗?我们使用的是Oracle 11g2。谢谢!
发布于 2013-03-07 22:28:09
动态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-08 06:59:29
您是否总是尝试使用相同的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;上面的语句不是动态的,而是根据需要返回不同的列.
https://stackoverflow.com/questions/15282817
复制相似问题