以前一直是用SQL,现在换ORACLE发现很多语法不一样。
我在定义存储过程时定义了一个NODE IN,作为用户输入的节点号,然后再调用时,我写了:
SQL_EXEC := 'SELECT * FROM TABLE WHERE ID = NODE'执行的时候这里总报错,请问是我调用参数的格式有问题么?

解决方案 »

  1.   

    这问题描述得没两句看懂了,呵呵你是换ORACLE是吧,以前用SQL SERVER吧,你是说定义了存储过程嘛?然后参数为:NODE,然后是传入参数是吧,那么存储过程调用方式和普通SQL是不一样的。首先你是在那里调用的,应用程序还是直接调用数据库的,应用程序需要使用(如JAVA程序):
    {call 过程名称(?,?)}如果使用PL/SQL代码段块调用(打印输出信息,查看第三方工具提供的OUTPUT区):
    BEGIN
       过程名称(参数);
    END;如果是在SQL命令行下这样执行(也可以直接用EXEC即可):
    SQL>execute 过程名称(参数);
    如果有打印输出信息,在调用过程前,先执行命令:set serveroutput on;调用过程报错,如果错误你觉得是些“鸟文”(几乎人类看不懂的那种),有两种可能性:
    1、过程有问题
    2、内部运行时调用了动态SQL,动态SQL执行时报错。若运行时报错报ORA-数字错误号码,则是抛出的异常信息,细节在说下去能说到天亮了。
      

  2.   

    多谢了,兄弟,我想知道我下面这个SQL里调用NODE这个参数的格式对吗?
    SQL_EXEC := 'SELECT * FROM TABLE WHERE ID = NODE'定义的部分我已经在存储过程开始部分写了,都调试通过了,就是卡在这里
      

  3.   

    SELECT * FROM TABLE WHERE ID = NODE中的NODE应该是一个变量值,是字符串类型的?
    如果是,应该把它串起来。
    另外,你最好给一个简单的完整示例重现你的问题。
      

  4.   

    SQL_EXEC := 'SELECT * FROM TABLE WHERE ID = :NODE';  --这个:NODE是个绑定变量execute immdate sql_exec using NODE; --这个NODE是个变量
      

  5.   


    楼上本来已经说完了,不过发现执行部分少写了两个字母,可能写快了,呵呵。SQL_EXEC := 'SELECT * FROM TABLE WHERE ID = :NODE';
    execute immediate sql_exec using NODE;ORACLE内部语法,任意一个字符串前面假如英文冒号(字符串是什么没有关系),代表这个外部变量(和赋值无关),若用于动态SQL,要将参数传入就按照这些顺序使用USING 变量即可,若为两个参数就为:
    SQL_EXEC := 'SELECT * FROM TABLE WHERE ID = :NODE AND name = :name1';
    execute immediate SQL_EXEC using NODE,name;前提是 NODE和name这两个变量你已经定义好了。execute immediate 为执行语法,没有参数就不用USING即可,有参数按顺序进去。
    每条语句结束后面记得带分号哈,你给的SQL没有,PL/SQL过不去