2012-10-31 139 views
0
CREATE OR REPLACE PROCEDURE ABC (REG_NO IN CO_ENROLMENT.S_REGNO%TYPE, 
            TERM  IN COURSEOFFERING.CO_TERMNUMBER%TYPE, 
            YEAR  IN COURSEOFFERING.CO_YEAR%TYPE, 
            CO_TITLE IN COURSE.C_TITLE%TYPE, 
            EN_DATE OUT CO_ENROLMENT.COE_ENROLDATE%TYPE, 
            COM_ST OUT CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE) 

AS 
BEGIN 
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
    INTO COM_ST, EN_DATE 
    FROM COURSEOFFERING O 
    INNER JOIN COURSE C 
      ON C.C_ID = O.C_ID 
    INNER JOIN CO_ENROLMENT M 
      ON M.CO_ID = O.CO_ID 
    WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
END ABC; 

我写过上面的程序。 下面是PL/SQL块上面的程序调用,PLSQL中使用ORACLE DB的程序

DECLARE 
    COMPL_STATUS CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE; 
    ENROL_DATE  CO_ENROLMENT.COE_ENROLDATE%TYPE; 
BEGIN 
    ABC (44444444, 2009, 2, 'PLSQL Programming', 
     EN_DATE => enrol_date, COM_ST =>compl_status); 
    DBMS_OUTPUT.PUT_LINE ('STUDENT COMPLETION STATUS AND ENROLMENT DATE IS ' 
         || ENROL_DATE 
         || ' ' 
         || compl_status); 
END; 

它的发现没有数据返回我的错误,但是当我运行查询分开我得到的输出。我无法弄清楚什么是错的。我是否正确编写了过程块,并且在PL/SQL块中传递的参数是否正确?

+0

如果你的程序没有做任何插入/更新/删除,那么为什么不使用函数呢? – user75ponic

+0

一切工作正常,除了输出值不被打印......输出行被打印即完成状态和注册日期是但ENROL_DATE和COMPL_STATUS没有值。我也通过查询进行了交叉检查,并使用相同的输入参数返回了我的输出值。虽然我不确定,但我认为问题在某个地方传递或检索输出参数。 – Pravin

+0

为什么你将2009年的价值转化为期限和2年?当然这些参数应该颠倒过来。看起来你会从总是使用命名参数符号(就像你用于最后两个参数)中获益。 –

回答

0

你没有正确地调用存储过程。你必须按照正确的顺序指定参数,或使用命名参数符号,即

ABC (44444444, 2, 2009, 'PLSQL Programming', enrol_date, compl_status); 

ABC (REG_NO => 44444444, YEAR => 2009, TERM => 2, 
    CO_TITLE => 'PLSQL Programming', 
    EN_DATE => enrol_date, COM_ST =>compl_status); 

你可以看到,如果使用命名参数符号,你可以以不同的顺序指定参数(或者如果参数具有DEFAULT值则根本没有)。

1

在proc你有第三名buth,你把它叫做第二名。以及 (COURSEOFFERING.CO_TERMNUMBER%TYPE,COURSEOFFERING.CO_TERMNUMBER%TYPE)类型是如何声明的?

+0

我声明了与指定表格列相同类型的所有字段。 – Pravin

+0

Ind参数切换 – elrado

+0

还是不行!!! :-( – Pravin

1

当您的ABC过程中的select语句没有返回任何行时,将引发NO_DATA_FOUND异常,并且您的存储过程的执行将被暂停。为了避免这种行为,您需要在存储过程中添加EXCEPTION部分来捕获异常并做出适当的反应。为此存储过程的执行部分可能:

BEGIN 
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
    INTO COM_ST, EN_DATE 
    FROM COURSEOFFERING O 
    INNER JOIN COURSE C 
      ON C.C_ID = O.C_ID 
    INNER JOIN CO_ENROLMENT M 
      ON M.CO_ID = O.CO_ID 
    WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example 
END ABC 

或者,如果你想继续,即使select语句引发的异常则可能是嵌套BEGIN .. END块附上select声明。

BEGIN 
    -- some code before 
    BEGIN  
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
     INTO COM_ST, EN_DATE 
     FROM COURSEOFFERING O 
     INNER JOIN COURSE C 
       ON C.C_ID = O.C_ID 
     INNER JOIN CO_ENROLMENT M 
       ON M.CO_ID = O.CO_ID 
     WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
    EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example 
    END; 
    -- some code after 
END ABC 
1

您的程序查询中可能缺少通配符。

16:02:06 [email protected]> select * from dual where 'abc' like 'ab'; 

no rows selected              


16:02:18 [email protected]> select * from dual where 'abc' like 'ab%'; 

D                 
-                 
X                 

没有他们,C.C_TITLE LIKE CO_TITLE等于C.C_TITLE = CO_TITLE,这是不是neccessarily你想要什么。

尝试C.C_TITLE LIKE '%'||CO_TITLE||'%'

+0

Cool dude .......... yippe ...经过这么多的奋斗后,ohh男人终于得到了输出!非常感谢你通配符是罪魁祸首.....但是我使用了TRIM函数,它应该给我结果?也许是 – Pravin

+0

。也许不会。这取决于你在修剪什么和如何修剪。没有看到实际的代码和数据一起看不出来。 –