我必须创建过程才能将行插入到表中,还需要包含可捕获任何错误的OUT参数。然而,当我测试使用匿名块它不会工作,但如果我在程序中使用异常它正在工作。这意味着如果我添加一个OUT参数,并且传递来自该块的值,它将无法工作。在Oracle的程序中使用OUT参数捕获错误
此代码的工作,但不是我想要的:
create or replace
PROCEDURE EXAM_SP
(P_FIRSTNAME IN BB_SHOPPER.FIRSTNAME%TYPE,
P_LASTNAME IN BB_SHOPPER.LASTNAME%TYPE,
P_ADDRESS IN BB_SHOPPER.ADDRESS%TYPE,
P_CITY IN BB_SHOPPER.CITY%TYPE,
P_STATE IN BB_SHOPPER.STATE%TYPE,
P_ZIP IN BB_SHOPPER.ZIPCODE%TYPE)
IS
BEGIN
INSERT INTO BB_SHOPPER (IDSHOPPER, FIRSTNAME, LASTNAME, ADDRESS, CITY,
STATE, ZIPCODE)
VALUES
(BB_SHOPPER_IDSHOPPER_SEQ.NEXTVAL,P_FIRSTNAME,P_LASTNAME,P_ADDRESS,
P_CITY, P_STATE,P_ZIP);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error Code = '||SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error Message = Please check input');
END EXAM_SP;.
但在上面的代码,如果我的名字在参数它不会工作,不知道如何做到这一点,如果我参数添加出来的程序和传递值:
create or replace
PROCEDURE EXAM_SP
(P_FIRSTNAME IN VARCHAR2,
P_LASTNAME IN VARCHAR2,
P_ADDRESS IN VARCHAR2,
P_CITY IN VARCHAR2,
P_STATE IN CHAR,
P_ZIP IN VARCHAR2,
P_ERROR OUT VARCHAR2)......
我会收到此错误
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
如果我删除参数,并使用ORI在开始工作时的金色代码。
匿名块获取错误:
DECLARE
LV_FIRSTNAME_TXT BB_SHOPPER.FIRSTNAME%TYPE := 'FIRST';
LV_LASTNAME_TXT BB_SHOPPER.LASTNAME%TYPE := 'LAST';
LV_ADDRESS_TXT BB_SHOPPER.ADDRESS%TYPE := '8899 TAPE PARK';
LV_CITY_TXT BB_SHOPPER.CITY%TYPE := 'JACKSONVILLE';
LV_STATE_TXT BB_SHOPPER.STATE%TYPE := 'FLd';
LV_ZIP_NUMBER BB_SHOPPER.ZIPCODE%TYPE := '34567';
LV_ERROR varchar2(100);
BEGIN
EXAM_SP(LV_FIRSTNAME_TXT, LV_LASTNAME_TXT, LV_ADDRESS_TXT,
LV_CITY_TXT,LV_STATE_TXT,LV_ZIP_NUMBER);
DBMS_OUTPUT.PUT_LINE(LV_ERROR);
END;
步骤:
create or replace
PROCEDURE EXAM_SP
(P_FIRSTNAME IN VARCHAR2,
P_LASTNAME IN VARCHAR2,
P_ADDRESS IN VARCHAR2,
P_CITY IN VARCHAR2,
P_STATE IN CHAR,
P_ZIP IN VARCHAR2,
P_ERROR OUT VARCHAR2)
IS
BEGIN
INSERT INTO BB_SHOPPER (IDSHOPPER, FIRSTNAME, LASTNAME, ADDRESS, CITY,
STATE, ZIPCODE)
VALUES
(BB_SHOPPER_IDSHOPPER_SEQ.NEXTVAL,P_FIRSTNAME,P_LASTNAME,P_ADDRESS,
P_CITY, P_STATE,P_ZIP);
EXCEPTION
WHEN OTHERS THEN
P_ERROR := SQLCODE;
/*DBMS_OUTPUT.PUT_LINE('Error Code = '||SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error Message = Please check input');
P_ERROR := SQLCODE;*/
END EXAM_SP;
,我接收
错误消息:
Error report:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 6
06502. 00000 - "PL/SQL: numeric or value error%s"
我已经在通过可变'FLd'
到过程参数为了测试错误捕获。
表结构:
IDSHOPPER NUMBER(4,0)
FIRSTNAME VARCHAR2(15 BYTE)
LASTNAME VARCHAR2(20 BYTE)
ADDRESS VARCHAR2(40 BYTE)
CITY VARCHAR2(20 BYTE)
STATE CHAR(2 BYTE)
ZIPCODE VARCHAR2(15 BYTE)
PHONE VARCHAR2(10 BYTE)
FAX VARCHAR2(10 BYTE)
EMAIL VARCHAR2(25 BYTE)
USERNAME VARCHAR2(8 BYTE)
PASSWORD VARCHAR2(8 BYTE)
COOKIE NUMBER(4,0)
DTENTERED DATE
PROVINCE VARCHAR2(15 BYTE)
COUNTRY VARCHAR2(15 BYTE)
...
为什么你想要使用一个out参数,而不是让调用者直接看到异常(并且还看到错误堆栈)?无论如何,你不清楚你有什么问题;为什么不告诉我们*不工作的代码以及你使用该代码的错误或问题? –
我想在这个实例中传回给匿名块并打印出来,或作为提示显示给用户。如果我参数添加出来的过程,我传递值,我会收到此错误:创建或替换 PROCEDURE EXAM_SP (P_FIRSTNAME IN VARCHAR2, P_LASTNAME IN VARCHAR2, P_ADDRESS IN VARCHAR2, P_CITY IN VARCHAR2, P_STATE在煤焦, P_ZIP IN VARCHAR2, P_ERROR OUT VARCHAR2)....... – DKCroat
请[编辑您的问题](https://stackoverflow.com/posts/45523242/edit)显示您的完整新程序*和*匿名块您正在使用;和错误堆栈跟踪,以便我们可以确切地看到抛出异常的位置。 –