无效 SQL 语句:语法不对了.

解决方案 »

  1.   

    是啊,那这个sql语句应该怎么写呢,多谢了
      

  2.   

    问题一:p_cur_trainsch OUT type_cur_trainsch 这语句中,过程与游标是否在包已字义?问题二:
    sql1 := 'SELECT ELECT_ID,SESS_ID FROM  TRAIN_SCH WHERE ELECT_ID ='''||p_elect_id||'''';
    OPEN p_cur_trainsch FOR sql1;
      

  3.   

    答复beckhambobo(beckham) 
    问题一:p_cur_trainsch OUT type_cur_trainsch ,这个我已经在包里已经定义,而且我改成静态执行是完全正确的。游标没问题,数据可以取出来。第二个问题是:我已经这样改了,不过报的错误是:
    游标不能在动态sql open语句中使用
    请问,是否还需要主意什么问题
      

  4.   

    记错,修改如下:sql1 := 'SELECT ELECT_ID,SESS_ID FROM  TRAIN_SCH WHERE ELECT_ID =:m';
    OPEN p_cur_trainsch FOR sql1 using p_elect_id;
      

  5.   

    还是不行,还是报同样的错误,游标不能在动态sql open语句中使用,
    还是要再请问一下beckhambobo(beckham),
    这个sql语句里的“m”是什么意思,谢谢
      

  6.   

    首先明确你的oracle版本是不是8i(或以上),若我没记错的话,只有8i才开始支持open写法。
    其次,open的语法很简单:open 游标变量 for 查询语句.
      

  7.   

    是9i,open这样写,我也知道,我用静态的是没错的,只是有一个存储过程最好要用动态执行,否则的话,代码很恐怖。我现在就是用动态不能执行。
      

  8.   

    我的代码如下:
    先是包:
    REATE OR REPLACE PACKAGE nears_trainsch_pg  IS
    TYPE type_cur_trainsch IS REF CURSOR RETURN TRAIN_SCH%ROWTYPE;
    PROCEDURE nears_listall_trainsch_sp
    (
    p_elect_id IN Varchar2,
    p_cur_trainsch OUT type_cur_trainsch
    );
    END nears_trainsch_pg;体如下:
    CREATE OR REPLACE PACKAGE BODY nears_trainsch_pg  ISPROCEDURE nears_listall_trainsch_sp
    (
    p_elect_id IN Varchar2,
    p_cur_trainsch OUT type_cur_trainsch
    )
    IS
    sql1 varchar2(255);
    BEGIN
    sql1 := '
    OPEN p_cur_trainsch FOR
    SELECT ELECT_ID,SESS_ID
    WHERE ELECT_ID ='|| p_elect_id;
    execute immediate sql1;
    END nears_listall_trainsch_sp;END nears_trainsch_pg;
      

  9.   

    我不用动态,我下面的代码是可以的,不过我有一个存储过程是需要动态执行,这个是我的测试存储过程,没问题的静态体如下:
    PROCEDURE nears_listall_trainsch_sp
    (
    p_elect_id IN Varchar2,
    p_cur_trainsch OUT type_cur_trainsch
    )
    IS

    BEGIN
    OPEN p_cur_trainsch FOR
    SELECT ELECT_ID,SESS_ID    
    FROM  TRAIN_SCH
    WHERE ELECT_ID = p_elect_id;

    END nears_listall_trainsch_sp;
      

  10.   

    先把游标设为弱类型:
    TYPE type_cur_trainsch IS REF CURSOR;
    .......
    sql1 := 'SELECT ELECT_ID,SESS_ID FROM  TRAIN_SCH WHERE ELECT_ID =:m';
    OPEN p_cur_trainsch FOR sql1 using p_elect_id;记得用完游标后关闲.
      

  11.   

    非常感谢 beckhambobo(beckham) ,可以了,游标设为弱类型就好使了