【问题标题】:need to create a temporary table inside my procedure which has a cursor in it需要在我的过程中创建一个临时表,其中有一个游标
【发布时间】:2020-02-22 11:03:24
【问题描述】:

下面的过程代码 :: TYPE 行在编译时出错。让我知道这里创建表的正确用法。

CREATE OR REPLACE PROCEDURE bulk_order_export 
    (
        startdate IN       varchar2,
        enddate   IN       varchar2,
           batchsize  IN       varchar2
    )   
    IS
      bulkorderdata_cursor sys_refcursor ;
      p_query_string  VARCHAR2(100);
     TYPE FBL_BACKUP_ORDER IS TABLE OF DPS_USER%TYPE;
      temp_order_id FBL_BACKUP_ORDER;
    BEGIN

    p_query_string := 'SELECT ID FROM abc_order WHERE REGISTRATION_DATE BETWEEN :startDate AND :endDate'; 
    OPEN bulkorderdata_cursor FOR p_query_string USING startdate, enddate;
    LOOP
        FETCH bulkorderdata_cursor BULK COLLECT into temp_order_id LIMIT batchsize;  
    FORALL i IN 1..temp_order_id.count
            INSERT INTO FBL_BACKUP_ORDER VALUES(temp_order_id(i));   
    --COMMIT;
        DBMS_OUTPUT.PUT_LINE('Commit '||temp_order_id.count||' inserted rows');
     Total := Total+temp_order_id.count;
     EXIT WHEN bulkorderdata_cursor%NOTFOUND;
    END LOOP;
    CLOSE bulkorderdata_cursor;
    END;

【问题讨论】:

  • 程序代码是高度特定于供应商的 - 所以请添加一个标签来指定您是否使用mysqlpostgresqlsql-serveroracledb2 - 或完全不同的东西。
  • 您好,我正在使用 oracle
  • 问题是我无法对临时表进行 decalre,我可以通过光标将批量收集的行插入到该临时表中。
  • 错误信息是什么?
  • FBL_BACKUP_ORDER 是一个用户定义的类型。您无法插入其中,因为它不是表格。声明变量时正确使用它 - temp_order_id。该变量是一个临时表 - (嗯,一个内存中的集合)并且您正在正确填充它。那么接下来你想做什么呢?插入 DPS_USER?

标签: sql oracle stored-procedures cursor


【解决方案1】:

关于 DPS_USER%TYPE,我假设是一个表?如果是,则语法为:DPS_USER%ROWTYPE。

然后你需要确保你的变量已经定义,batchsize 是数字,然后你已经整理了一些语法,你就可以开始了

SQL> create table DPS_USER ( id int );

Table created.

SQL> create table abc_order ( id int );

Table created.

SQL> create table FBL_BACKUP_ORDER ( id int );

Table created.

SQL>
SQL>
SQL> CREATE OR REPLACE PROCEDURE bulk_order_export
  2      (
  3          startdate IN       varchar2,
  4          enddate   IN       varchar2,
  5             batchsize  IN    int
  6      )
  7      IS
  8        bulkorderdata_cursor sys_refcursor ;
  9        p_query_string  VARCHAR2(100);
 10       TYPE FBL_BACKUP_ORDER IS TABLE OF DPS_USER%ROWTYPE;
 11        temp_order_id FBL_BACKUP_ORDER;
 12        total int;
 13      BEGIN
 14
 15      p_query_string := 'SELECT ID FROM abc_order WHERE REGISTRATION_DATE BETWEEN :startDate AND :endDate';
 16      OPEN bulkorderdata_cursor FOR p_query_string USING startdate, enddate;
 17      LOOP
 18          FETCH bulkorderdata_cursor BULK COLLECT into temp_order_id LIMIT batchsize;
 19      FORALL i IN 1..temp_order_id.count
 20              INSERT INTO FBL_BACKUP_ORDER VALUES temp_order_id(i);
 21      --COMMIT;
 22          DBMS_OUTPUT.PUT_LINE('Commit '||temp_order_id.count||' inserted rows');
 23       Total := Total+temp_order_id.count;
 24       EXIT WHEN bulkorderdata_cursor%NOTFOUND;
 25      END LOOP;
 26      CLOSE bulkorderdata_cursor;
 27      END;
 28  /

Procedure created.

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2020-12-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多