【问题标题】:ORACLE : how to create dynamic update procedure depending on parameters?ORACLE:如何根据参数创建动态更新程序?
【发布时间】:2016-04-06 04:18:44
【问题描述】:

我想制作更新表的列的更新过程取决于参数。

这是否可以根据输入参数更新字段?

这是我制作的示例程序:

CREATE OR REPLACE PROCEDURE procedure(parameter in varchar2)
IS errormessage varchar2(255);
  BEGIN
  UPDATE table
SET table.parameter = 'newvalue'
END;

它不起作用。 请帮忙。

【问题讨论】:

  • 所以parameter 是需要更新的列。你想将所有列硬编码为newvalue吗?
  • no @Utsav 我会从另一个表中选择那个新值,你发布的代码,它正在工作!无论如何谢谢:)

标签: oracle parameters procedure


【解决方案1】:

编辑:处理的 SQL 注入场景。

您需要execute immediate,因为parameter 将用作列名。

注意:请记住,您正在运行没有 where 子句的 update 语句,它将更新所有行。

您也不能传递数字列名,因为值 newvalue 是一个字符串。所以如果你想处理它,那么在运行更新语句之前使用 if else 条件并检查列数据类型。

CREATE OR REPLACE PROCEDURE proc12(column_name in varchar2)
IS
v_count integer;
  BEGIN
  select count(*) into v_count from (select column_name as txt from dual) where regexp_like (txt,'[,|=|;]');
  if v_count =0 then
  execute immediate 'UPDATE tbl1 SET '||column_name||' = ''newvalue''';
  else
  dbms_output.put_line('SQL Injection detected. Exiting');
 end if;
END;




select * from tbl1;

+------+
| col1 |
+------+
| abc  |
| pqr  |
| xyz  |
+------+

call proc12('col1');

select * from tbl1;

+----------+
|   col1   |
+----------+
| newvalue |
| newvalue |
| newvalue |
+----------+

call proc12('balance=10000, col1');
SQL Injection detected. Exiting

【讨论】:

  • 更好用execute immediate 'UPDATE tbl1 SET '||column_name||' = :val' USING newvalue;
  • 这是在生产系统上使用时的安全问题(sql 注入),例如call proc12('balance=10000, col1') 会将所有行的余额更新为 10000。
  • @FrankOckenfuss - 谢谢。我添加了处理它的逻辑。
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 2019-05-09
  • 2011-11-11
  • 2019-09-29
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多