日期:2014-05-17  浏览次数:20903 次

创建存储过程报错,急!!
我在sql plus中创建了一个存储过程,可是报下面错误,请问我哪里错了??

SQL> CREATE OR REPLACE PROCEDURE ObtainPartNumberProc( leftobid in VARCHAR2 ) as 
  2 V_SQLString VARCHAR2( 100 ) ;
  3 BEGIN
  4 V_SQLString :='SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE LEFT='||leftobid||' ;
  5 EXECUTE IMMEDIATE V_SQLString;
  6 END ObtainPartNumberProc
  7 /

警告: 创建的过程带有编译错误。

------解决方案--------------------
SQL code

定义一个动态游标作为返回类型,这样才有意义

CREATE OR REPLACE PROCEDURE ObtainPartNumberProc( leftobid in VARCHAR2,rst out sys_refcursor) 
is
  V_SQLString VARCHAR2( 1000 ) ;
BEGIN
  V_SQLString :='SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE LEFT='||leftobid;
  open rst for V_SQLString;
END ObtainPartNumberProc;

------解决方案--------------------
从这个来看,你的版本太低,估计是8i之类的。因为从9i开始才有SYS_REFCURSOR这个默认的弱类型.
如果没有可以这么修改:
定义一个包,然后在包中定义类型
CREATE OR REPLACE PACKAGE "TYPES" as
type refcursor is ref cursor; 
end;
 
CREATE OR REPLACE PROCEDURE obtainpartnumberproc (
leftobid IN VARCHAR2,
rst IN OUT refcursor

或者也可以通过其它方式。
------解决方案--------------------
探讨
不是横,是着急,呵呵!我在toad里编绎这段代码后,报第三行有错误:
CREATE OR REPLACE PROCEDURE obtainpartnumberproc (
leftobid IN VARCHAR2,
rst IN OUT sys_refcursor
)
IS
v_sqlstring VARCHAR2 (1000);
BEGIN
v_sqlstring :=
'SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE LEFT='
|| leftobid;

OPEN rst FOR v_sqlstring;
END…

------解决方案--------------------
你创建的是个独立存储过程,运行时不用带TYPES.