如何在ORACLE SQL语句中使用日期类型绑定变量?

如何在ORACLE SQL语句中使用日期类型绑定变量?,oracle,plsql,Oracle,Plsql,我的查询中有一个循环,所以我必须使用Oracle过程,但它只有在我给出硬编码的日期时才起作用,但我想用绑定变量来实现它,如何实现呢 我的查询: DECLARE TABLE_NAME VARCHAR2(100); SQL_STATEMENT VARCHAR2(2000); TOTAL_CASES NUMBER(10) := 0; LOOP_CASES NUMBER(10) := 0; BEGIN FOR MY_ROW IN 00..99 LOOP

我的查询中有一个循环,所以我必须使用Oracle过程,但它只有在我给出硬编码的日期时才起作用,但我想用绑定变量来实现它,如何实现呢

我的查询:

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE(''15-MAY-2016'') and TO_DATE(''21-MAY-2016'')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_CHAR(:start_dt);
    END_DATE Date := TO_CHAR(:end_dt);
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE('||START_DATE||') and TO_DATE('||END_DATE||')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_DATE(:start_dt,'dd-mm-yyyy');
    END_DATE Date := TO_DATE(:end_dt,'dd-mm-yyyy');
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between '||START_DATE||' and'||END_DATE||'';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
set serveroutput on;
set echo on;
DECLARE
   TABLE_NAME VARCHAR2(100);
   SQL_STATEMENT VARCHAR2(2000);
   TOTAL_CASES NUMBER(10) := 0;
   LOOP_CASES NUMBER(10) := 0;
   START_DATE DATE := to_date(:st_date,'DD-MM-YYYY');  
    END_DATE DATE:= to_date(:en_date,'DD-MM-YYYY'); 
BEGIN
   FOR MY_ROW IN 00..99
   LOOP
       TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

       SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID)
FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109
       AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) 
       between '''||START_DATE ||''' and '''||END_DATE||'''';
       EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
       TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
   END LOOP;
   DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
/
上面的查询给了我输出,但我想使用Bind变量作为日期参数,怎么做

我尝试过的解决方案:

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE(''15-MAY-2016'') and TO_DATE(''21-MAY-2016'')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_CHAR(:start_dt);
    END_DATE Date := TO_CHAR(:end_dt);
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE('||START_DATE||') and TO_DATE('||END_DATE||')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_DATE(:start_dt,'dd-mm-yyyy');
    END_DATE Date := TO_DATE(:end_dt,'dd-mm-yyyy');
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between '||START_DATE||' and'||END_DATE||'';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
set serveroutput on;
set echo on;
DECLARE
   TABLE_NAME VARCHAR2(100);
   SQL_STATEMENT VARCHAR2(2000);
   TOTAL_CASES NUMBER(10) := 0;
   LOOP_CASES NUMBER(10) := 0;
   START_DATE DATE := to_date(:st_date,'DD-MM-YYYY');  
    END_DATE DATE:= to_date(:en_date,'DD-MM-YYYY'); 
BEGIN
   FOR MY_ROW IN 00..99
   LOOP
       TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

       SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID)
FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109
       AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) 
       between '''||START_DATE ||''' and '''||END_DATE||'''';
       EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
       TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
   END LOOP;
   DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
/
但它显示ORA-00907:缺少右括号

我尝试的另一个解决方案:

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE(''15-MAY-2016'') and TO_DATE(''21-MAY-2016'')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_CHAR(:start_dt);
    END_DATE Date := TO_CHAR(:end_dt);
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE('||START_DATE||') and TO_DATE('||END_DATE||')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_DATE(:start_dt,'dd-mm-yyyy');
    END_DATE Date := TO_DATE(:end_dt,'dd-mm-yyyy');
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between '||START_DATE||' and'||END_DATE||'';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
set serveroutput on;
set echo on;
DECLARE
   TABLE_NAME VARCHAR2(100);
   SQL_STATEMENT VARCHAR2(2000);
   TOTAL_CASES NUMBER(10) := 0;
   LOOP_CASES NUMBER(10) := 0;
   START_DATE DATE := to_date(:st_date,'DD-MM-YYYY');  
    END_DATE DATE:= to_date(:en_date,'DD-MM-YYYY'); 
BEGIN
   FOR MY_ROW IN 00..99
   LOOP
       TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

       SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID)
FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109
       AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) 
       between '''||START_DATE ||''' and '''||END_DATE||'''';
       EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
       TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
   END LOOP;
   DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
/
但它给出了错误ORA-00905:缺少关键字

如何解决这个问题?

您可以尝试以下方法:

DECLARE
    TABLE_NAME    varchar2(100);
    SQL_STATEMENT varchar2(2000);
    TOTAL_CASES   number(10)  := 0;
    LOOP_CASES    number(10)  := 0;
    START_DATE    date        := to_date(:start_dt,'dd-mm-yyyy');
    END_DATE      date        := to_date(:end_dt,'dd-mm-yyyy');
    v_ubs         varchar2(50):='CRM'
    v_ai          pls_integer := 109;
BEGIN
    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));
        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
                          FROM '||TABLE_NAME||'@hr 
                         WHERE ATTRIBUTE_ID = :ai 
                           AND OLD_VALUE IS NULL 
                           AND UPDATED_BY_SCREEN = :ubs 
                           AND TRUNC(UPDATE_DATE) between :START_DATE and :END_DATE ';
        EXECUTE IMMEDIATE SQL_STATEMENT using v_ai, v_ubs, START_DATE, END_DATE;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);
END;

我通过声明分配给绑定变量的变量得到了解决方案。主要的问题是它是日期类型的变量,所以我需要特别注意倒逗号

请参见下面的解决方案:

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE(''15-MAY-2016'') and TO_DATE(''21-MAY-2016'')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_CHAR(:start_dt);
    END_DATE Date := TO_CHAR(:end_dt);
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE('||START_DATE||') and TO_DATE('||END_DATE||')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_DATE(:start_dt,'dd-mm-yyyy');
    END_DATE Date := TO_DATE(:end_dt,'dd-mm-yyyy');
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between '||START_DATE||' and'||END_DATE||'';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
set serveroutput on;
set echo on;
DECLARE
   TABLE_NAME VARCHAR2(100);
   SQL_STATEMENT VARCHAR2(2000);
   TOTAL_CASES NUMBER(10) := 0;
   LOOP_CASES NUMBER(10) := 0;
   START_DATE DATE := to_date(:st_date,'DD-MM-YYYY');  
    END_DATE DATE:= to_date(:en_date,'DD-MM-YYYY'); 
BEGIN
   FOR MY_ROW IN 00..99
   LOOP
       TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

       SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID)
FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109
       AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) 
       between '''||START_DATE ||''' and '''||END_DATE||'''';
       EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
       TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
   END LOOP;
   DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
/
请特别注意
SQL\u语句
中的

=============================================================================================================

编辑:

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE(''15-MAY-2016'') and TO_DATE(''21-MAY-2016'')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_CHAR(:start_dt);
    END_DATE Date := TO_CHAR(:end_dt);
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE('||START_DATE||') and TO_DATE('||END_DATE||')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_DATE(:start_dt,'dd-mm-yyyy');
    END_DATE Date := TO_DATE(:end_dt,'dd-mm-yyyy');
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between '||START_DATE||' and'||END_DATE||'';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
set serveroutput on;
set echo on;
DECLARE
   TABLE_NAME VARCHAR2(100);
   SQL_STATEMENT VARCHAR2(2000);
   TOTAL_CASES NUMBER(10) := 0;
   LOOP_CASES NUMBER(10) := 0;
   START_DATE DATE := to_date(:st_date,'DD-MM-YYYY');  
    END_DATE DATE:= to_date(:en_date,'DD-MM-YYYY'); 
BEGIN
   FOR MY_ROW IN 00..99
   LOOP
       TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

       SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID)
FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109
       AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) 
       between '''||START_DATE ||''' and '''||END_DATE||'''';
       EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
       TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
   END LOOP;
   DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
/
仅使用显式转换(更好的解决方案):

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE(''15-MAY-2016'') and TO_DATE(''21-MAY-2016'')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_CHAR(:start_dt);
    END_DATE Date := TO_CHAR(:end_dt);
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between TO_DATE('||START_DATE||') and TO_DATE('||END_DATE||')';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    START_DATE Date:= TO_DATE(:start_dt,'dd-mm-yyyy');
    END_DATE Date := TO_DATE(:end_dt,'dd-mm-yyyy');
BEGIN

    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

        SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID) 
        FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109 

        AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) between '||START_DATE||' and'||END_DATE||'';
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
set serveroutput on;
set echo on;
DECLARE
   TABLE_NAME VARCHAR2(100);
   SQL_STATEMENT VARCHAR2(2000);
   TOTAL_CASES NUMBER(10) := 0;
   LOOP_CASES NUMBER(10) := 0;
   START_DATE DATE := to_date(:st_date,'DD-MM-YYYY');  
    END_DATE DATE:= to_date(:en_date,'DD-MM-YYYY'); 
BEGIN
   FOR MY_ROW IN 00..99
   LOOP
       TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));

       SQL_STATEMENT:='SELECT COUNT(DISTINCT USR_ID)
FROM ' || TABLE_NAME || '@hr WHERE ATTRIBUTE_ID = 109
       AND OLD_VALUE IS NULL AND UPDATED_BY_SCREEN = ''CRM'' AND TRUNC(UPDATE_DATE) 
       between '''||START_DATE ||''' and '''||END_DATE||'''';
       EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES;
       TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
   END LOOP;
   DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);

END;
/

使用绑定变量有两种可能的方法。第一种方法-如果需要在匿名块内设置参数值:

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    -- here you calculate values to use in dynamic SQL:
    start_date date := TO_DATE('15-MAY-2016','dd-mom-yyyy');
    end_date date := TO_DATE('21-MAY-2016','dd-mon-yyyy');
BEGIN
    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));    
        SQL_STATEMENT:=
            'SELECT COUNT(DISTINCT USR_ID) 
               FROM ' || TABLE_NAME || '@hr 
              WHERE ATTRIBUTE_ID = 109 
                AND OLD_VALUE IS NULL 
                AND UPDATED_BY_SCREEN = ''CRM'' 
                AND TRUNC(UPDATE_DATE) between :P_START and :P_END'; 
          -- there are 2 parameters above - :P_START and :P_END
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES 
            using start_date, end_date;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);
END;
第二种方法-当匿名块也必须采用参数时:

DECLARE
    TABLE_NAME VARCHAR2(100);
    SQL_STATEMENT VARCHAR2(2000);
    TOTAL_CASES NUMBER(10) := 0;
    LOOP_CASES NUMBER(10) := 0;
    -- one way is when you receive string dates:
    start_date date := TO_DATE(:P_OUTER_START_DATE,'dd-mom-yyyy');
    end_date date := TO_DATE(:P_OUTER_END_DATE,'dd-mon-yyyy');
    -- or another way if you can set parameter in date format outside:
    start_date date := :P_OUTER_START_DATE;
    end_date date := :P_OUTER_END_DATE;
BEGIN
    FOR MY_ROW IN 00..99
    LOOP
        TABLE_NAME:= 'history'||TRIM(TO_CHAR(MY_ROW,'00'));    
        SQL_STATEMENT:=
            'SELECT COUNT(DISTINCT USR_ID) 
               FROM ' || TABLE_NAME || '@hr 
              WHERE ATTRIBUTE_ID = 109 
                AND OLD_VALUE IS NULL 
                AND UPDATED_BY_SCREEN = ''CRM'' 
                AND TRUNC(UPDATE_DATE) between :P_START and :P_END'; 
          -- there are 2 parameters above - :P_START and :P_END
        EXECUTE IMMEDIATE SQL_STATEMENT INTO LOOP_CASES 
            using start_date, end_date;
        TOTAL_CASES := TOTAL_CASES + LOOP_CASES;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TOTAL_CASES);
END;

有两组参数:第一对是
:p\u OUTER\u START\u DATE
:p\u OUTER\u END\u DATE
,它们是整个块的参数;第二对是
:P_START
:P_END
,它们是在块内执行的内部SQL查询的参数。无论如何,我建议也使用
execute immediate
中的参数。

谷歌搜索“tom kyte bind variables”,他是甲骨文的大师。@BarbarosÖzhan谢谢,伙计,但找不到与我的查询相关的问题。不起作用,在
中输入错误,说
ORA-06550:20行,第92列:PLS-00103:在预期以下情况之一时遇到符号“INTO”:。(,*@%&=-+;at in是mod rements而不是rem return返回,或者!=或者~=>=我通过删除“INTO LOOP_CASES”部分进行了编辑,并将表名置于外部。请重试。这里将日期变量(
start_date
)与字符串(
SQL_STATEMENT
)连接起来,这意味着隐式数据转换以及潜在的问题和bug。通常你应该避免这种情况。编辑了我的答案,现在只使用显式转换。这会起作用,但有办法让它更简单。@Dmitry是的,你的答案稍微简单一点(第二个)…感谢您的回复。它不起作用。它仍然使用日期的硬编码值。我想为它使用绑定变量。它将如何为P_开始和P_结束赋值?它是否取决于变量的位置和顺序?@ShivamSharma您想在这个块之外设置参数?我只是想使用绑定变量动态地给出日期不可能。请检查我的答案,因为我已经在那里找到了解决方案。