2017-06-01 51 views
0

我在Oracle中在这种情况下,参数是如何传递

CREATE OR REPLACE 
PROCEDURE ReportCalculate 
    (
     param_acTypeId in NUMBER 
) 
    AS 
    sqlstr VARCHAR2(500); 
    result NUMBER; 
    BEGIN 
    sqlstr:='select count(1) from table1 where 1=1 and AC_TYPE_LEVEL1_ID=:acTypeId'; 
    execute immediate sqlstr into result using param_acTypeId; 
    DBMS_OUTPUT.PUT_LINE(result); 
    END; 

一个程序,但有时我想查询所有的数据,SQL看起来像这样 select count (1) from table1 where 1 = 1 and AC_TYPE_LEVEL1_ID = AC_TYPE_LEVEL1_ID, 那么应该如何传递参数,或param_acTypeId应该有任何默认值?是否仅在拼接sql时才能判断?

回答

1

一个典型的方法是接受NULL的意思是“所有”:

sqlstr := 'select count(1) from table1 where AC_TYPE_LEVEL1_ID = :acTypeId or :acTypeId is null'; 

我要指出,这个版本排除使用索引。如果性能问题,则使用两个查询:

if param_acTypeId is null then 
    sqlstr := 'select count(1) from table1'; 
    execute immediate sqlstr into result; 
else 
    sqlstr := 'select count(1) from table1 where AC_TYPE_LEVEL1_ID = :acTypeId'; 
    execute immediate sqlstr into result using param_acTypeId; 
end if; 
DBMS_OUTPUT.PUT_LINE(result); 
1

您不需要动态SQL。如果您通过NULL那么它会计算所有行:

CREATE OR REPLACE PROCEDURE ReportCalculate (
    param_acTypeId in NUMBER 
) 
AS 
    result NUMBER; 
BEGIN 
    select count(1) 
    into result 
    from table1 
    where (param_acTypeId IS NULL OR AC_TYPE_LEVEL1_ID = param_acTypeId); 

    DBMS_OUTPUT.PUT_LINE(result); 
END;