Stored procedures PL/SQL:将词法参数传递给存储过程

Stored procedures PL/SQL:将词法参数传递给存储过程,stored-procedures,plsql,Stored Procedures,Plsql,我想将整个sql查询作为词法参数传递给存储过程,然后执行它。有什么建议吗?不确定“词法”参数是什么意思,但您可以将SQL查询作为VARCHAR2传入,然后使用execute IMMEDIATE执行它。您尝试的方法几乎肯定是错误的 executeimmediate应谨慎使用,因为当许多不同的SQL语句以这种方式运行时,它可能a)带来安全风险,b)对性能造成负面影响 但是,请参见如何使用executeimmediate插入记录。请注意,必须使用绑定变量。您可以尝试以下方法: create or re

我想将整个sql查询作为词法参数传递给存储过程,然后执行它。有什么建议吗?

不确定“词法”参数是什么意思,但您可以将SQL查询作为VARCHAR2传入,然后使用execute IMMEDIATE执行它。

您尝试的方法几乎肯定是错误的

executeimmediate
应谨慎使用,因为当许多不同的SQL语句以这种方式运行时,它可能a)带来安全风险,b)对性能造成负面影响

但是,请参见如何使用
executeimmediate
插入记录。请注意,必须使用绑定变量。

您可以尝试以下方法:

create or replace procedure my_proc(pstring IN varchar2)
is

begin

  if length(pstring)>0 then

     EXECUTE IMMEDIATE pstring;

  end if;

end my_proc;

以下是oracle关于动态plsql的官方文档:

如果您想运行查询(与DML[插入、更新、删除]或PL/SQL代码块相反),可以执行以下操作:

function get_dataset (p_sql_query in varchar2) return sys_refcursor
as
  l_returnvalue sys_refcursor;
begin

  open l_returnvalue for p_sql_query;

  return l_returnvalue;

end get_dataset;
返回值是一个“弱类型”REF游标


调用程序(无论是Java、.NET、PL/SQL等)必须处理函数结果并关闭光标。

感谢您的回复,我正在这样做。按原样创建或替换过程testproc(str varchar2(1000)),开始立即执行(str);结束;这是正确的方法还是我遗漏了什么?省去“(1000)”,因为您没有指定IN参数的长度。您所说的“执行它”是什么意思?查询用于返回结果-您需要定义希望存储过程对结果执行的操作。嗨,Jeffrey,我想做的是在运行时将查询提供给存储过程,例如,我想执行insert操作,我将在运行时在执行过程时提供insert查询。查询是否始终返回相同的列和数据类型集?否,因为如果是这种情况,则无需传递整个查询。不清楚您需要该过程做什么。谢谢Alex,这非常有用。非常,非常非常确定你没有其他方法来做这件事?执行未知SQL可能非常危险,攻击者如果遇到这种情况,基本上可以对您的数据库执行任何操作……Thanx ObiWanKenobi,这很有用。