【发布时间】:2023-04-11 08:26:01
【问题描述】:
我有以下查询,它在遇到符号时给出错误(在使用循环的行中。我正在尝试开发一个函数,它将动态参数作为 table_name、column_name、table_id 并用于其他表。
FUNCTION get_encryp_pass( table_name IN varchar2,column_name IN varchar2,table_id IN varchar2) RETURN VARCHAR2
IS
BEGIN
EXECUTE IMMEDIATE 'for c1 in (select * from' || table_name ||) loop
EXECUTE IMMEDIATE 'update ' || table_name || ' set ' || column_name = encrypt_val(c1.column_name) || ' where ' || table_id || ' = ' || c1.table_id and column_name is not null;
end loop;
END get_encrypt_pass;
【问题讨论】:
-
您没有足够的单引号。例如,在附加表名之后,您需要在 ) 之前再次加上引号。
EXECUTE IMMEDIATE需要一个字符串。 -
@Nitesh 我试过但仍然遇到同样的错误。 Jchomel 你能解释一下吗?
-
样本表是什么样子的,该表的 3 个输入参数中有哪些可能的值?
-
但是您实际上并没有将加密密码作为字符串返回,是吗?您正在函数内部执行
UPDATE并修改表中的值。UPDATE无论如何都不能在 SQL 中完成。 -
假设您没有进行更新,而只是进行了 SELECT。想想你想要返回多少行。您要查找的是 1 个加密密码还是整个表?如果是整个表,那么你需要考虑返回数组。如果它只是 1 个密码,那么您需要传入一个
ID的值来识别该 1 行并按它进行过滤。
标签: oracle function for-loop plsql execute-immediate