【问题标题】:Stored procedure through Data Service通过数据服务存储过程
【发布时间】:2016-06-22 15:55:00
【问题描述】:

我有这个存储过程:

CREATE OR REPLACE PROCEDURE GET_NEXT_ID(NEXTID OUT INTEGER)
IS
BEGIN
    SELECT SQC_RS_PEDIDO.NEXTVAL INTO NEXTID FROM DUAL;
END GET_NEXT_ID;

获取下一个 ID。然后我在数据服务和导入函数上添加了这个存储过程。

在我的数据服务上创建的自动代码是:

public ObjectResult<Nullable<global::System.Decimal>> GET_NEXT_ID(ObjectParameter nEXTID)
{
    return base.ExecuteFunction<Nullable<global::System.Decimal>>("GET_NEXT_ID", nEXTID);
}

然后在我使用的数据服务上公开它:

[WebGet]
public ObjectResult<decimal?> GET_NEXT_ID()
{
    return this.CurrentDataSource.GET_NEXT_ID(new ObjectParameter("NEXTID", typeof(Decimal)));
}

但我遇到了一个例外:

存储数据提供程序返回的数据读取器没有足够的列用于请求的查询。

我做错了什么?

【问题讨论】:

    标签: c# stored-procedures wcf-data-services


    【解决方案1】:

    尝试在数据库中声明一个函数而不是一个过程。

    CREATE OR REPLACE FUNCTION GET_NEXT_ID RETURN INTEGER IS
    
    NEXTID INTEGER;
    
    BEGIN
    
       SELECT SQC_RS_PEDIDO.NEXTVAL INTO NEXTID FROM DUAL;
    
       RETURN NEXTID;
    
    END GET_NEXT_ID;
    

    【讨论】:

    • 当我运行时,我收到错误:警告:已编译但存在编译错误另外:[错误]语法检查(1:40):找到:'IS'预期:返回 - 或 -或- WRAPPED - 或- TIMESTAMP
    • 我猜这是甲骨文。你能发布错误信息吗?
    • 是的,是甲骨文。当我测试代码给我:[错误]语法检查(1:40):发现:'IS'期望:返回-或-(-或-包装-或-时间戳
    • 现在我通过数据模型添加了该功能,但是该功能应该如何使用呢?我现在不能使用“函数导入”
    • 如果您通过创建数据库对象的模式以外的模式进行连接,这可能是由于缺少特权。
    【解决方案2】:

    您的查询希望读者将 ID 作为选择返回,但您的存储过程已设置为通过输出变量将参数传回。简单的解决方法是只从 select 语句中返回值,而不是将其插入到输出变量中。

    【讨论】:

    • 你能举个例子吗?
    • 我不懂数据库语法(Oracle?),但基本上我会使用标准 SQL:选择 NEXTVAL。您必须从数据库中选择 ID,而不是将其作为输出变量返回,并且不使用 RETURN 语句返回它,才能使 WCF 代码正常工作。或者更改 WCF 代码,但我不确切知道 ExecuteFunction 的语法也可以更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2011-09-08
    • 2018-11-13
    • 1970-01-01
    • 2012-03-16
    • 2023-04-11
    相关资源
    最近更新 更多