【问题标题】:How to execute native sql in oracle 12 coracle 12c如何执行原生sql
【发布时间】:2019-08-21 00:52:28
【问题描述】:

我无法执行原生 sql。

我遇到以下错误:

ORA-01422:精确提取返回的行数超过了请求的行数 ORA-06512: 在第 10 行 01422. 00000 - “精确提取返回的行数超过了请求的行数” *原因:exact fetch 中指定的数字小于返回的行数。 *行动:重写查询或更改请求的行数
sqltest := 'select create_ts  from WORKFLOW_CODES where id =' || p_id;
execute immediate (sqltest) into v_create_ts;
open p_recordset for
select v_create_ts from dual;
DBMS_SQL.RETURN_RESULT(p_recordset);

end;

【问题讨论】:

    标签: sql oracle dynamic native


    【解决方案1】:

    您不需要单独的变量来存储 sql 结果中的值,以将其传递到 RETURN_RESULTdual 表。为原表定义的refcursor可以直接传递

    DECLARE
         p_id          INT := 1;
         p_recordset   SYS_REFCURSOR;
    BEGIN
         OPEN p_recordset FOR 'select create_ts  
                           from WORKFLOW_CODES where id = ' 
         || DBMS_ASSERT.enquote_literal (p_id); -- enquote_literal to 
                                                -- prevent SQL injection
         DBMS_SQL.return_result(p_recordset);
    END;
    /
    

    【讨论】:

    • 非常感谢您的回复.. 但这给了我错误“SQL 命令未正确结束”。
    • @palak : 你的 Oracle 版本是什么?
    • Oracle 12c 版本 1
    • @palak : 你是在使用这个 SQL 块还是在其他过程中使用它?这个块对我有用。
    • @palak :您应该知道 StackOverflow 中的一条基本规则,即提出与正在讨论的问题相关的原始问题无关的查询是不可接受的。您面临的问题必须作为一个单独的问题提出,并附上与之相关的任何细节。我相信这个答案可以解决您原始问题中的问题,如果您发现答案有用,请考虑accepting,这样它也可以帮助其他人。另请阅读this
    【解决方案2】:

    这个:

    select create_ts from WORKFLOW_CODES where id =' || p_id
    

    应该只返回一行(一个 CREATE_TS 值),但它返回两(或更多)行,所以 Oracle 会抱怨它。应用另一个条件来限制返回的行数,或者 - 如果 ID 应该是 unique,请确保它确实是(例如,通过删除重复项并应用主键或唯一键 /索引)。


    为了说明我在说什么:

    SQL> create table workflow_codes(id number, create_ts number);
    
    Table created.
    
    SQL> insert into workflow_codes
      2    select 1, 100 from dual union all
      3    select 1, 200 from dual union all
      4    --
      5    select 3, 300 from dual;
    
    3 rows created.
    

    ID = 1 有 2 行,所以会返回错误:

    SQL> declare
      2    l_create_ts number;
      3  begin
      4    select create_ts into l_create_ts from workflow_codes where id = 1;
      5  end;
      6  /
    declare
    *
    ERROR at line 1:
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at line 4
    

    ID = 3 可以:

    SQL> l4
      4*   select create_ts into l_create_ts from workflow_codes where id = 1;
    SQL> c/1/3
      4*   select create_ts into l_create_ts from workflow_codes where id = 3;
    SQL> l
      1  declare
      2    l_create_ts number;
      3  begin
      4    select create_ts into l_create_ts from workflow_codes where id = 3;
      5* end;
    SQL> /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 2020-09-28
      • 2018-04-04
      • 1970-01-01
      • 2017-07-16
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多