我正在尝试构建可修复的函数来导出数据从用户选择的任何表中选择任意数量的用户选择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;
/
问题出在这条线上。
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操作。