执行存储过程时出现Oracle Uknown命令错误

问题描述:

我正在使用SQl Developer在名为CONTRACTOR_REG的包中执行过程。该程序具有以下签名。执行存储过程时出现Oracle Uknown命令错误

PROCEDURE usp_ins_contractor_all(
      webid   VARCHAR2,-- 
      firstname  VARCHAR2,-- 
      lastname  VARCHAR2,-- 
      middlename  VARCHAR2,-- 
      busname  VARCHAR2,-- 
      townname  VARCHAR2,-- 
      strname  VARCHAR2,-- 
      strtypecd  VARCHAR2,-- 
      strpfxcd  VARCHAR2,-- 
      strsfxcd  VARCHAR2,-- 
      addressoverflo VARCHAR2,-- 
      houseno  VARCHAR2,-- 
      zipcd   VARCHAR2,-- 
      state   VARCHAR2,-- 
      phonenum  VARCHAR2,-- 
      phonenight  VARCHAR2, 
      phonecell  VARCHAR2,-- 
      phonefax  VARCHAR2,-- 
      phonepager  VARCHAR2, 
      licno   VARCHAR2,-- 
      regSite  VARCHAR2, 
      licstate  VARCHAR2,-- 
      level_type  VARCHAR2 := 'NA',-- 
      type_cd  CHAR) 

我试图执行以下操作:

exec user1.contractor_reg.usp_ins_contractor_all('testing12345', 
      'test', 
      'me', 
      'a', 
      'testbiz', 
      'DFGGH', 
      'something', 
      null, 
      null, 
      null, 
      'pobox:12345', 
      '45', 
      '00000', 
      'DF', 
      '1231231231', 
      '2342342344', 
      '443243242', 
      '111111111', 
      null, 
      '123123123', 
      null, 
      'FD', 
      'NA', 
      'EC') 

我获得以下错误:

Error starting at line 25 in command: 
      'EC') 
Error report: 
Unknown Command 

似乎真的随机给我,什么是错我的最后一个参数?

在此先感谢!

+0

它是一个真正的存储过程,还是一个包内的过程? – DCookie 2011-04-18 17:17:50

+0

程序包,aorry猜我应该更清楚,我习惯于mssql。 – kralco626 2011-04-18 17:20:19

Aparently,你不能有换行符其间的每一个放慢参数,像我一样......愚蠢的计划......

EXEC user1.contractor_reg.usp_ins_contractor_all(“testing12345”,“测试”,“我”,'一','testbiz','sdfsdf','something',null,null,null,'pobox:12345','45','00000','sdfff','1231231231','2342342344','443243242', '111111111',null,'123123123',null,'sdff','E1','EC')

+1

普通换行符在SQL * Plus或SQL Developer的'EXEC'中不起作用。但是,您可以使用延续字符('-')将命令继续到第二行;至少在SQL * Plus中,尚未在SQL Developer中进行测试。 [SQL * Plus的文档](http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch12022.htm#i2697931) – 2011-04-18 21:22:46

+0

@alex,这其实有一个很好的理由吗?为什么不能像其他语言一样空白...... – kralco626 2011-04-19 10:58:18

+0

这不是一个真正的语言问题,它是客户端(SQL * Plus或SQL Developer,至少)如何解释和转换您所呈现的呼叫为'EXEC ''天。如果您尝试将整个调用输入到SQL * Plus中,它会尝试在第一次返回时立即执行它,它不会等待(或需要)尾随的';'。我怀疑SQL Developer为了兼容性而复制它。根据客户是如何或受到约束,不知道是否有理由,可能是历史性的。你需要问Oracle * 8) – 2011-04-19 11:19:37

您在回复中提到的原因可能不是导致错误的原因。

亚历克斯下文提到的,使用EXEC用sqlplus,你需要使用延续字符,如果你的命令跨越多行...

http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch12022.htm#i2697931

EXEC是SQLPLUS命令。当您使用..

exec p1; 

在sqlplus,这反过来又增加了一个开始和结束块来执行你的程序......

begin 
    p1; 
end; 
/

不知道SQL Developer支持this.I不有权访问SQL Developer在工作,但..

您是否尝试过使用BEGIN-END执行此过程?

begin 
    user1.contractor_reg.usp_ins_contractor_all('testing12345', 
      'test', 
      'me', 
      'a', 
      'testbiz', 
      'DFGGH', 
      'something', 
      null, 
      null, 
      null, 
      'pobox:12345', 
      '45', 
      '00000', 
      'DF', 
      '1231231231', 
      '2342342344', 
      '443243242', 
      '111111111', 
      null, 
      '123123123', 
      null, 
      'FD', 
      'NA', 
      'EC'); 
end; 
/
+0

当我开发一个使用NHibernate的SP包装器时,我发现需要BEGIN/END – devio 2011-04-18 18:02:49

+0

是的,这也适用,只需要在存储的proc调用后添加';' – kralco626 2011-04-18 18:15:49

+0

[documentation](http://download.oracle .com/docs/cd/B19306_01/server.102/b14357/ch12022.htm#i2697931)对于'EXEC'提到命令必须放在一行上,但可以明确地继续。 – 2011-04-18 21:24:21