用于Select的过程参数(Oracle,PL / SQL)

时间:2018-01-08 12:54:30

标签: sql oracle plsql parameters oracle12c

我有执行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?

2 个答案:

答案 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;

(您可能希望实际上对结果做一些事情,而不是像上面那样忽略它们,但这可能是另一个问题。根据这个目的,它可能不需要是动态的无论是。)