尝试通过将动态光标传递给函数来构建导出到csv

问题描述 投票:1回答:1

我正在尝试构建可修复的函数来导出数据从用户选择的任何表中选择任意数量的用户选择csv文件我搜索并发现他们就像制作类型的包,...等link here ...另一种方法是使用我选择的动态光标,但是我收到错误,如下所示

我试图使用具有RETURN类型的CURSOR但是,只有没有RETURN类型的REF CURSOR可以通过嵌入式动态OPEN语句“打开”。

注意这个程序还没有完成,因为我需要制作UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.x);也可以修复我的工作但我需要摆脱这个错误任何建议真的很感激

[Error] PLS-00320 (9: 13): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00382 (27: 22): PLS-00382: expression is of wrong type
[Error] PLS-00320 (29: 29): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00320 (30: 44): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00320 (31: 44): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00320 (32: 44): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00320 (33: 44): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00320 (34: 44): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00320 (35: 44): PLS-00320: the declaration of the type of this expression is incomplete or malformed
[Error] PLS-00320 (36: 44): PLS-00320: the declaration of the type of this expression is incomplete or malformed
CREATE OR REPLACE FUNCTION EXPORT_TO_CSV_NEW (P_SQL_STMT   IN VARCHAR2,
                                              P_TABLE_NAME IN VARCHAR2,
                                              P_CREATED_BY IN VARCHAR2) RETURN NUMBER IS 

   TYPE CUR_TYPE IS REF CURSOR; ---  RETURN WAREHOUSE%ROWTYPE;
   CUR  CUR_TYPE;
   CUR_RG   CUR%ROWTYPE;
   SQL_STMT VARCHAR2 (4000);

   FILETYPE UTL_FILE.FILE_TYPE;
   FILENAME VARCHAR2(256);
   DIRECTORYNAME VARCHAR2(1280) := 'SRJD_DEFAULT_TEMP_DIR';

   ERR_CODE VARCHAR2(64);
   ERR_MSG  VARCHAR2(1024);

BEGIN

 SAVEPOINT SETP1;

   FILENAME := TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') || '_WAREHOUSE.CSV';
   FILETYPE := UTL_FILE.FOPEN (DIRECTORYNAME,FILENAME,'w',32767);
   SQL_STMT := P_SQL_STMT;

   OPEN CUR FOR SQL_STMT;
    LOOP
        FETCH CUR INTO CUR_RG;
            UTL_FILE.PUT (FILETYPE,        CUR_RG.PRODUCT_ID);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.CLASSIFICATION_ID);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.PRODUCT_DESC);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.MANUFACTORY);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.BOX_COUNT);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.BOX_COST);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.BOX_ITEM_COUNT);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.ITEM_COST);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.MEASUREMENT_UNIT);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.REVENUE_PCT);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.ITEM_PRICE);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.TOTAL_ITEM_QUANTITY);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.TOTAL_COST);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.NOTES);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.CREATED_BY);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.CREATED_ON);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.UPDATED_BY);
            UTL_FILE.PUT (FILETYPE, ',' || CUR_RG.UPDATED_ON);

           UTL_FILE.NEW_LINE (FILETYPE);
         EXIT WHEN CUR%NOTFOUND;       
    END LOOP;

   UTL_FILE.FCLOSE (FILETYPE);
   CLOSE CUR;

   RETURN (1);

EXCEPTION WHEN OTHERS THEN 

    ROLLBACK TO STEP1;

    ERR_CODE := SQLCODE;
    ERR_MSG := SUBSTR(SQLERRM, 1, 1024);

    SQL_STMT := F_INS_ERROR_LOG(SYSDATE,              --P_ERROR_TIME,
                                P_CREATED_BY,         --P_USER_ID,
                                'EXPORT_TO_CSV_NEW',      --P_PROGRAM_UNIT,
                                NULL,                 --P_ERROR_LOCATION,
                                'FileName '||FILENAME,--P_KEY_DATA_DESC,
                                ERR_CODE,             --P_ERROR_CODE,
                                ERR_MSG);             --P_ERROR_MSG';
RETURN -1;

END EXPORT_TO_CSV_NEW;
/
oracle csv plsql
1个回答
0
投票

问题出在这条线上。

CUR_RG   CUR%ROWTYPE;

您正在尝试将记录定义为rowtype变量的REF CURSOR - 这是不允许的。

您正在将查询作为过程参数传递。所以,它不能在你的程序中初始化为CURSOR。你只能OPEN它作为REF CURSOR.

解决此问题的一种方法是使用查询在此过程中声明CURSOR,而不是将其作为参数传递。但是,如果您需要将查询作为参数传递,那么您可以定义一个RECORD TYPE,其中包含您将获取的所有必需列。

TYPE prodrec IS RECORD
(
 PRODUCT_ID           WAREHOUSE.PRODUCT_ID%TYPE,
 CLASSIFICATION_ID    WAREHOUSE.CLASSIFICATION_ID%TYPE,
 PRODUCT_DESC         WAREHOUSE.PRODUCT_DESC%TYPE,
 MANUFACTORY          WAREHOUSE.MANUFACTORY%TYPE,
 BOX_COUNT            WAREHOUSE.BOX_COUNT%TYPE,
 BOX_COST             WAREHOUSE.BOX_COST%TYPE,
 BOX_ITEM_COUNT       WAREHOUSE.BOX_ITEM_COUNT%TYPE,
 ITEM_COST            WAREHOUSE.ITEM_COST%TYPE,
 MEASUREMENT_UNIT     WAREHOUSE.MEASUREMENT_UNIT%TYPE,
 REVENUE_PCT          WAREHOUSE.REVENUE_PCT%TYPE,
 ITEM_PRICE           WAREHOUSE.ITEM_PRICE%TYPE,
 TOTAL_ITEM_QUANTITY  WAREHOUSE.TOTAL_ITEM_QUANTITY%TYPE,
 TOTAL_COST           WAREHOUSE.TOTAL_COST%TYPE,
 NOTES                WAREHOUSE.NOTES%TYPE,
 CREATED_BY           WAREHOUSE.CREATED_BY%TYPE,
 CREATED_ON           WAREHOUSE.CREATED_ON%TYPE,
 UPDATED_BY           WAREHOUSE.UPDATED_BY%TYPE,
 UPDATED_ON           WAREHOUSE.UPDATED_ON%TYPE
 );

然后声明此记录类型的变量。

CUR_RG prodrec;.

通过此更改,您的FETCH语句将正常工作。

并且,我看到你在EXCEPTION中使用回滚。这没有任何意义,因为您没有执行任何DML操作。

© www.soinside.com 2019 - 2024. All rights reserved.