ORA-06550 第 10 行,第 41 列:PLS-00103:在预期以下情况之一时遇到符号“,”:

Posted

技术标签:

【中文标题】ORA-06550 第 10 行,第 41 列:PLS-00103:在预期以下情况之一时遇到符号“,”:【英文标题】:ORA-06550 line 10, column 41: PLS-00103: Encountered the symbol "," when expecting one of the following: 【发布时间】:2015-05-06 04:18:35 【问题描述】:

我正在从 C# 执行一个匿名 PL/SQL 块,但我收到如下错误:

ORA-06550 第 10 行,第 41 列:PLS-00103:遇到符号“,” 预期以下情况之一时:

我的代码:

OracleDB AppConn = new OracleDB();
OracleDataReader eligiblereader = null;

 string id = "2304502001101";
 long provider = 667;
 long policy = 150;
 DateTime to = Convert.ToDateTime("2015/05/06");
using (OracleConnection con = AppConn.Connection)

 OracleCommand cmd = con.CreateCommand();

 cmd.Connection = con;
cmd.CommandText = @"declare 
                  p_id   VARCHAR2;
                  p_policy_id   NUMBER;
                  p_provider_id   NUMBER;
                  p_date        DATE;
                  p_tob         tob_type;
                 begin
                                 pbm_pkg.get_member_tob(p_id,p_policy_id,p_provider_id,p_date,p_tob);
open :refcur for select tob_type.benefit_id from dual;
end;";
OracleParameter p = cmd.Parameters.Add(
                         "rs", OracleDbType.RefCursor,
                         DBNull.Value,
                         ParameterDirection.Output);
 OracleParameter p_id = new OracleParameter();
  p_id.OracleDbType = OracleDbType.Varchar2;
  p_id.Direction = ParameterDirection.Input;
  p_id.Value = id;

OracleParameter p_policy_id = new OracleParameter();
p_policy_id.OracleDbType = OracleDbType.Int64;
p_policy_id.Direction = ParameterDirection.Input;
p_policy_id.Value = policy;

OracleParameter p_provider_id = new OracleParameter();
p_provider_id.OracleDbType = OracleDbType.Int64;
p_provider_id.Direction = ParameterDirection.Input;
p_provider_id.Value = provider;

OracleParameter p_date = new OracleParameter();
p_date.OracleDbType = OracleDbType.Date;
p_date.Direction = ParameterDirection.Input;
p_date.Value = to;
cmd.Parameters.Add(p_id);
cmd.Parameters.Add(p_policy_id);
cmd.Parameters.Add(p_provider_id);
cmd.Parameters.Add(p_date);

    try
    
    con.Open();

    cmd.ExecuteNonQuery();

eligiblereader = ((OracleRefCursor)cmd.Parameters[4].Value).GetDataReader();

 while (eligiblereader.Read())
 
  string id = eligiblereader.GetValue(0).ToString();



catch (Exception ex)
 

finally
 
con.Close();

return View();
        

命令执行'cmd.ExecuteNonQuery();'时出现错误

我想我在匿名块中遗漏了一些东西。

【问题讨论】:

我删除了 cmd.CommandType = CommandType.StoredProcedure;现在我得到 ora-01006 绑定变量不存在 @downvoters 你能说说这个问题他有什么问题吗? 我认为无论谁投反对票,都不在乎发表评论。太胆小了,不敢匿名。无论如何,请看我更新的答案。 【参考方案1】:

p_id VARCHAR2;

这肯定是不正确的语法,会引发编译错误。

错误重现:

SQL> DECLARE
  2    p_id VARCHAR2;
  3  BEGIN
  4    NULL;
  5  END;
  6  /
  p_id VARCHAR2;
       *
ERROR at line 2:
ORA-06550: line 2, column 8:
PLS-00215: String length constraints must be in range (1 .. 32767)


SQL>

因此,您必须在 1 .. 32767 之间指定 字符串长度限制。

解决方案:

指定字符串变量所需的长度。

SQL> DECLARE
  2    p_id VARCHAR2(20);
  3  BEGIN
  4    NULL;
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL>

open :refcur for select tob_type.benefit_id from dual;

您需要为 refcursor 声明绑定变量。

例如,

SQL> var r refcursor
SQL>
SQL> BEGIN
  2    OPEN :r FOR SELECT empno,ename FROM emp;
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL> print r

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER

14 rows selected.

SQL>

【讨论】:

感谢拉利特,但现在我收到 ora-01006 绑定变量不存在 @Sachu 请查看我的更新。不知道为什么有人反对? 是的,这解决了这个错误。但不知道如何声明 p_tob tob_type;这是来自 oracle 过程的 out 参数,具有表对象的类型.. @Sachu 我理解正确,p_tob 是 OUT 参数,您想稍后在匿名块中使用它。它的数据类型是什么? @Lalit.. 这是我们的数据库管理员创建的表结构对象。现在我让他把 out 参数作为参考光标,这样我就可以避免这种方法了。

以上是关于ORA-06550 第 10 行,第 41 列:PLS-00103:在预期以下情况之一时遇到符号“,”:的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06550:第 12 行,第 9 列:PL/SQL:ORA-00936:缺少表达式 ORA-06550:第 9 行,第 5 列:PL/SQL:忽略 SQL 语句

ORA-06550:第 1 行,第 13 列:PLS-00382:表达式类型错误 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略

ORA-06550:第 1 行,第 7 列:PLS-00201:必须声明标识符“PAYMENT_UPDATE” ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略

必须声明组件错误 (ORA-06550)

ORA-06550:第 1 行,第 7 列:\nPLS-00905:对象 TEST.CMPPROJECTPROC 无效\nORA-06550:第 1 行,第 7 列:\nPL/SQL:语句被忽略&qu

“ORA-06550: 第 1 行, 第 7 列”解决方法