2015-07-13 48 views
1

这里执行过载存储过程是我的程序:问题在PL/SQL

CREATE OR REPLACE PACKAGE shop_query_pkg IS 
    PROCEDURE shop_info_pp 
    (p_id IN bb_shopper.idshopper%TYPE, 
    p_firstname OUT bb_shopper.firstname%TYPE, 
    p_city OUT bb_shopper.city%TYPE, 
    p_state OUT bb_shopper.state%TYPE, 
    p_phone OUT bb_shopper.phone%TYPE, 
    p_email OUT bb_shopper.email%TYPE); 
    PROCEDURE shop_info_pp 
    (p_id IN bb_shopper.lastname%TYPE, 
    p_firstname OUT bb_shopper.firstname%TYPE, 
    p_city OUT bb_shopper.city%TYPE, 
    p_state OUT bb_shopper.state%TYPE, 
    p_phone OUT bb_shopper.phone%TYPE, 
    p_email OUT bb_shopper.email%TYPE); 
END; 
/
CREATE OR REPLACE PACKAGE BODY shop_query_pkg IS 
    PROCEDURE shop_info_pp 
    (p_id IN bb_shopper.idshopper%TYPE, 
    p_firstname OUT bb_shopper.firstname%TYPE, 
    p_city OUT bb_shopper.city%TYPE, 
    p_state OUT bb_shopper.state%TYPE, 
    p_phone OUT bb_shopper.phone%TYPE, 
    p_email OUT bb_shopper.email%TYPE) 
    IS 
    BEGIN 
     SELECT firstname, city, state, phone, email 
     INTO p_firstname, p_city, p_state, p_phone, p_email 
     FROM bb_shopper 
     WHERE idshopper = p_id; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('ID does not exist'); 
    END;  
    PROCEDURE shop_info_pp 
    (p_id IN bb_shopper.lastname%TYPE, 
    p_firstname OUT bb_shopper.firstname%TYPE, 
    p_city OUT bb_shopper.city%TYPE, 
    p_state OUT bb_shopper.state%TYPE, 
    p_phone OUT bb_shopper.phone%TYPE, 
    p_email OUT bb_shopper.email%TYPE) 
    IS 
    BEGIN 
     SELECT firstname, city, state, phone, email 
     INTO p_firstname, p_city, p_state, p_phone, p_email 
     FROM bb_shopper 
     WHERE lastname = p_id; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('Last name does not exist'); 
    END; 
END; 

然而,当我尝试使用此代码来执行我的程序:

VARIABLE g_fname VARCHAR2 
VARIABLE g_city VARCHAR2 
VARIABLE g_state VARCHAR2 
VARIABLE g_phone VARCHAR2 
VARIABLE g_email VARCHAR2 

EXECUTE shop_query_pkg.shop_info_pp(23, :g_fname, :g_city, :g_state, :g_phone, :g_email); 

PRINT :g_fname 
PRINT :g_city 
PRINT :g_state 
PRINT :g_phone 
PRINT :g_email 

我收到此错误信息:

BEGIN shop_query_pkg.shop_info_pp(23, :g_fname, :g_city, :g_state, :g_phone, :g_email); END; 

* 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at "S36.SHOP_QUERY_PKG", line 11 
ORA-06512: at line 1 

我觉得我的select语句有些问题,但我一直在检查它,我无法弄清楚wha这是错的。

这里是DESC bb_shopper:

Name Null? Type 
IDSHOPPER NOT NULL NUMBER(4) 
FIRSTNAME  VARCHAR2(15) 
LASTNAME  VARCHAR2(20) 
ADDRESS  VARCHAR2(40) 
CITY  VARCHAR2(20) 
STATE  CHAR(2) 
ZIPCODE  VARCHAR2(15) 
PHONE  VARCHAR2(10) 
FAX  VARCHAR2(10) 
EMAIL  VARCHAR2(25) 
USERNAME  VARCHAR2(8) 
PASSWORD  VARCHAR2(8) 
COOKIE  NUMBER(4) 
DTENTERED  DATE 
PROVINCE  VARCHAR2(15) 
COUNTRY  VARCHAR2(15) 
PROMO  CHAR(1) 

是的,我已经尝试改变状态为CHAR,我也得到了同样的信息。

+0

你需要充分地描述你的'bb_shopper'表。列,数据类型等 – sstan

+0

想想我想通了,我不明白为什么,但我不得不使用匿名块来执行它。 –

+0

程序的第一个和第二个版本之间有什么区别?重载的过程需要有不同的签名 - 至少有一个参数需要不同的类型/名称。 – Rusty

回答

0

您必须完全指定VARIABLE类型并添加最大的varchar2大小。

如果您使用以下块,它按预期工作:

VARIABLE g_fname VARCHAR2(60) 
VARIABLE g_city VARCHAR2(60) 
VARIABLE g_state VARCHAR2(60) 
VARIABLE g_phone VARCHAR2(60) 
VARIABLE g_email VARCHAR2(60) 

EXECUTE shop_query_pkg.shop_info_pp(23, :g_fname, :g_city, :g_state, :g_phone, :g_email); 

PRINT :g_fname 
PRINT :g_city 
PRINT :g_state 
PRINT :g_phone 
PRINT :g_email