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