我有执行Select的程序:
PROCEDURE Test (colValue IN VARCHAR2)
IS
vINS VARCHAR2(32000) := 'select * from abc.table where col10 = colValue';
BEGIN
EXECUTE IMMEDIATE vINS;
END;
但我不确定参数 colValue 是否正确用于Select,
也许应该像:= colValue?
答案 0 :(得分:1)
您可以连接变量(||)。
编辑:正如mathguy所指出的那样,由于你使用的是VARCHAR2
变量,你需要用附加的引号将其括起来。显然,对于数字变量,这不是必需的
PROCEDURE Test (colValue IN VARCHAR2)
IS
vINS VARCHAR2(32000) := 'select * from abc.table where col10 = ''' || colValue ||'''';
BEGIN
EXECUTE IMMEDIATE vINS;
END;
事实证明,在您的情况下使用绑定变量非常有效。但是,如果您正在使用TABLE名称,COLUMN名称动态,您必须坚持连接,因为
表和列名称不能作为绑定变量传递
vINS VARCHAR2(32000) := 'select * from abc.table where col10 = :var';
EXECUTE IMMEDIATE vINS USING colValue;
但是,如果您没有将结果存储到变量或集合中,则在EXECUTE IMMEDIATE
中运行select语句是没有用的。
您可以使用REF CURSOR
输出变量,打印结果。
PROCEDURE Test (colValue IN VARCHAR2, vINS OUT SYS_REFCURSOR)
IS
BEGIN
OPEN vINS FOR select * from abc.table where col10 = colValue;
END;
VARIABLE x REFCURSOR;
EXECUTE Test ('Value',:x);
PRINT x;
如果您使用的是Oracle 12c,则可以使用DBMS_SQL.return_result
PROCEDURE Test (colValue IN VARCHAR2 )
IS
l_cursor SYS_REFCURSOR;
BEGIN
OPEN vINS FOR select * from abc.table where col10 = colValue;
DBMS_SQL.return_result (l_cursor);
END;
答案 1 :(得分:1)
您应该使用绑定变量,如下所示:
procedure test(colvalue in varchar2)
is
vins long := 'select * from abc.table where col10 = :b1';
begin
execute immediate vins using colvalue;
end;
(您可能希望实际上对结果做一些事情,而不是像上面那样忽略它们,但这可能是另一个问题。根据这个目的,它可能不需要是动态的无论是。)