Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORACLE:如何根据参数创建动态更新过程?_Oracle_Parameters_Procedure - Fatal编程技术网

ORACLE:如何根据参数创建动态更新过程?

ORACLE:如何根据参数创建动态更新过程?,oracle,parameters,procedure,Oracle,Parameters,Procedure,我想让更新表列的更新过程取决于参数 是否可以根据输入参数更新字段 这是我制作的示例程序: CREATE OR REPLACE PROCEDURE procedure(parameter in varchar2) IS errormessage varchar2(255); BEGIN UPDATE table SET table.parameter = 'newvalue' END; 但它不起作用。 请提供帮助。编辑:已处理的SQL注入场景 您需要立即执行,因为参数将用作列名 注意:请

我想让更新表列的更新过程取决于参数

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

这是我制作的示例程序:

CREATE OR REPLACE PROCEDURE procedure(parameter in varchar2)
IS errormessage varchar2(255);
  BEGIN
  UPDATE table
SET table.parameter = 'newvalue'
END;
但它不起作用。
请提供帮助。

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

您需要
立即执行
,因为
参数
将用作列名

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

此外,由于值
newvalue
是字符串,因此不能传递数字列名。所以,若您想要处理它,那个么在运行update语句之前,使用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

因此,
参数
是需要更新的列。您想将所有列硬编码为
newvalue
?否@Utsav我将从另一个表中选择该newvalue,并对您发布的代码进行编码,它正在工作!无论如何谢谢:)最好使用newvalue使用
执行立即的'updatetbl1 SET'| | | | column| |'=:val在生产系统上使用时,这是一个安全问题(sql注入),例如,
调用proc12('balance=10000,col1')
将所有行的余额更新为10000。@FrankOckenfuss-谢谢。我添加了逻辑来处理它。