我搜索了一些如何使用立即执行从 select 语句返回值的示例,但它不断返回错误“ORA-00903:无效的表名”。
这是代码示例:
DECLARE
LAST_NUMBER NUMBER;
CURSOR C_SEQUENCES IS
SELECT
A.SEQUENCE_NAME, B.TABLE_NAME, C.COLUMN_NAME
FROM
USER_SEQUENCES A
INNER JOIN
USER_CONSTRAINTS B ON A.SEQUENCE_NAME = REPLACE(B.CONSTRAINT_NAME, 'PK', 'SEQ_ID')
INNER JOIN
USER_CONS_COLUMNS C ON B.CONSTRAINT_NAME = C.CONSTRAINT_NAME
WHERE
B.CONSTRAINT_TYPE = 'P';
BEGIN
FOR REG IN C_SEQUENCES LOOP
EXECUTE IMMEDIATE 'SELECT MAX(:1) FROM :2' INTO LAST_NUMBER USING REG.COLUMN_NAME, REG.TABLE_NAME;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
是的,该表确实存在。
有任何想法吗?
我认为唯一的方法是将这两个变量连接起来:
EXECUTE IMMEDIATE 'SELECT MAX('||REG.COLUMN_NAME||') FROM '||REG.TABLE_NAME INTO LAST_NUMBER;
Run Code Online (Sandbox Code Playgroud)
我还建议你为列名和表名创建一个验证函数,以防 SQL 注入。
| 归档时间: |
|
| 查看次数: |
5884 次 |
| 最近记录: |