Oracle PL/SQL 问题:PLS-00306:调用时参数的数量或类型错误
Oracle PL/SQL issue: PLS-00306 : wrong number or types of arguments in call to
今天我的代码出现错误
PLS-00306: wrong number or types of arguments in call to
并且我确保代码工作正常但是当我在动态代码中使用时不起作用
CREATE OR REPLACE PROCEDURE TB_DATA(P_TB_NAME VARCHAR2)
IS
V_COLUMNS VARCHAR2(32000) := GET_ALL_COLUMNS(P_TB_NAME) ;
V_COLUMNS_IN_LOOP VARCHAR2(32000) := 'I.'||REPLACE ( GET_ALL_COLUMNS(P_TB_NAME) , ',' , '||'',''||I.') ;
V_FILE UTL_FILE.FILE_TYPE ;
BEGIN
EXECUTE IMMEDIATE 'DECLARE
CURSOR C1 IS
SELECT '||V_COLUMNS || '
FROM '||P_TB_NAME || ';
BEGIN
' ||V_FILE ||' := UTL_FILE.FOPEN ( ''MY_DIR'' , ''TASK9.CSV'' , ''W'' ) ;
UTL_FILE.PUT_LINE ( '||V_FILE ||' , '|| V_COLUMNS||');
FOR I IN C1 LOOP
UTL_FILE.PUT_LINE ( '||V_FILE ||', '|| V_COLUMNS_IN_LOOP||') ;
END LOOP ;
END ;';
END ;
函数:
CREATE OR REPLACE FUNCTION HR.GET_ALL_COLUMNS (P_TABLE VARCHAR2)
RETURN VARCHAR2
IS
CURSOR C IS
SELECT *
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = P_TABLE ;
CURSOR C1 IS
SELECT *
FROM TAB
WHERE TNAME = P_TABLE ;
V_COLS VARCHAR2(32000);
V_COLS2 VARCHAR2(32000);
BEGIN
FOR I IN C LOOP
V_COLS := V_COLS ||','|| I.COLUMN_NAME ;
END LOOP ;
FOR V IN C1 LOOP
V_COLS2 := V_COLS2 ||','|| P_TABLE ;
END LOOP ;
RETURN LTRIM( V_COLS , ',') ;
END ;
我只需要知道我的错误在哪里或遗漏了什么。
功能正常;这是失败的过程,因为您必须在代码的动态 SQL 部分内声明 V_FILE,而不是在其外部。像这样:
SQL> CREATE OR REPLACE PROCEDURE TB_DATA (P_TB_NAME VARCHAR2)
2 IS
3 V_COLUMNS VARCHAR2 (32000) := GET_ALL_COLUMNS (P_TB_NAME);
4 V_COLUMNS_IN_LOOP VARCHAR2 (32000)
5 := 'I.' || REPLACE (GET_ALL_COLUMNS (P_TB_NAME), ',', '||'',''||I.');
6 L_STR VARCHAR2 (10000);
7 BEGIN
8 L_STR :=
9 'DECLARE
10 V_FILE UTL_FILE.FILE_TYPE;
11 CURSOR C1 IS
12 SELECT '
13 || V_COLUMNS
14 || '
15 FROM '
16 || P_TB_NAME
17 || ';
18 BEGIN
19 V_FILE := UTL_FILE.FOPEN ( ''MY_DIR'' , ''TASK9.CSV'' , ''W'' ) ;
20 FOR I IN C1 LOOP
21 UTL_FILE.PUT_LINE ( V_FILE, '
22 || V_COLUMNS_IN_LOOP
23 || ') ;
24 END LOOP ;
25 UTL_FILE.FCLOSE(V_FILE);
26 END ;';
27
28 EXECUTE IMMEDIATE L_STR;
29 END;
30 /
Procedure created.
测试:
SQL> EXEC TB_DATA('DEPT');
PL/SQL procedure successfully completed.
SQL>
今天我的代码出现错误
PLS-00306: wrong number or types of arguments in call to
并且我确保代码工作正常但是当我在动态代码中使用时不起作用
CREATE OR REPLACE PROCEDURE TB_DATA(P_TB_NAME VARCHAR2)
IS
V_COLUMNS VARCHAR2(32000) := GET_ALL_COLUMNS(P_TB_NAME) ;
V_COLUMNS_IN_LOOP VARCHAR2(32000) := 'I.'||REPLACE ( GET_ALL_COLUMNS(P_TB_NAME) , ',' , '||'',''||I.') ;
V_FILE UTL_FILE.FILE_TYPE ;
BEGIN
EXECUTE IMMEDIATE 'DECLARE
CURSOR C1 IS
SELECT '||V_COLUMNS || '
FROM '||P_TB_NAME || ';
BEGIN
' ||V_FILE ||' := UTL_FILE.FOPEN ( ''MY_DIR'' , ''TASK9.CSV'' , ''W'' ) ;
UTL_FILE.PUT_LINE ( '||V_FILE ||' , '|| V_COLUMNS||');
FOR I IN C1 LOOP
UTL_FILE.PUT_LINE ( '||V_FILE ||', '|| V_COLUMNS_IN_LOOP||') ;
END LOOP ;
END ;';
END ;
函数:
CREATE OR REPLACE FUNCTION HR.GET_ALL_COLUMNS (P_TABLE VARCHAR2)
RETURN VARCHAR2
IS
CURSOR C IS
SELECT *
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = P_TABLE ;
CURSOR C1 IS
SELECT *
FROM TAB
WHERE TNAME = P_TABLE ;
V_COLS VARCHAR2(32000);
V_COLS2 VARCHAR2(32000);
BEGIN
FOR I IN C LOOP
V_COLS := V_COLS ||','|| I.COLUMN_NAME ;
END LOOP ;
FOR V IN C1 LOOP
V_COLS2 := V_COLS2 ||','|| P_TABLE ;
END LOOP ;
RETURN LTRIM( V_COLS , ',') ;
END ;
我只需要知道我的错误在哪里或遗漏了什么。
功能正常;这是失败的过程,因为您必须在代码的动态 SQL 部分内声明 V_FILE,而不是在其外部。像这样:
SQL> CREATE OR REPLACE PROCEDURE TB_DATA (P_TB_NAME VARCHAR2)
2 IS
3 V_COLUMNS VARCHAR2 (32000) := GET_ALL_COLUMNS (P_TB_NAME);
4 V_COLUMNS_IN_LOOP VARCHAR2 (32000)
5 := 'I.' || REPLACE (GET_ALL_COLUMNS (P_TB_NAME), ',', '||'',''||I.');
6 L_STR VARCHAR2 (10000);
7 BEGIN
8 L_STR :=
9 'DECLARE
10 V_FILE UTL_FILE.FILE_TYPE;
11 CURSOR C1 IS
12 SELECT '
13 || V_COLUMNS
14 || '
15 FROM '
16 || P_TB_NAME
17 || ';
18 BEGIN
19 V_FILE := UTL_FILE.FOPEN ( ''MY_DIR'' , ''TASK9.CSV'' , ''W'' ) ;
20 FOR I IN C1 LOOP
21 UTL_FILE.PUT_LINE ( V_FILE, '
22 || V_COLUMNS_IN_LOOP
23 || ') ;
24 END LOOP ;
25 UTL_FILE.FCLOSE(V_FILE);
26 END ;';
27
28 EXECUTE IMMEDIATE L_STR;
29 END;
30 /
Procedure created.
测试:
SQL> EXEC TB_DATA('DEPT');
PL/SQL procedure successfully completed.
SQL>