【问题标题】:SELECT INTO variable in Procedure程序中的 SELECT INTO 变量
【发布时间】:2017-08-20 10:35:19
【问题描述】:

如果我在 Oracle SQL 开发人员中运行它:

    set serveroutput on

DECLARE 
    key_column varchar2(30) := 'Test';
BEGIN
    dbms_output.put_line('key_col = ' || key_column );

    SELECT cols.column_name INTO key_column
    FROM all_constraints cons
    INNER JOIN all_cons_columns cols ON cons.constraint_name = cols.constraint_name
                                    AND cons.owner = cols.owner
                                    AND cons.constraint_type = 'P'
    WHERE cons.owner = 'TAS'
    AND cols.table_name = 'COMMENT_ALL_TXT';

   DBMS_OUTPUT.PUT_LINE('1 key_column: ' || key_column);

END 
; 

输出是:

匿名块完成

key_col = 测试

1 key_column:COM_ALL_TXT_KEY

当我将相同的代码放入一个过程中时,输出如下:

ORA-01403:未找到数据

为什么程序代码在 SQL 工作表中运行时找不到约束?

这是程序代码:

create or replace PROCEDURE MMW1164.USP_BATCH_CLEANUP_NEW
IS
key_column VARCHAR2(100);
BEGIN

  SELECT cols.column_name INTO key_column
    FROM all_constraints cons
    INNER JOIN all_cons_columns cols ON cons.constraint_name = cols.constraint_name
                                    AND cons.owner = cols.owner
                                    AND cons.constraint_type = 'P'
    WHERE cons.owner = 'TAS'
    AND cols.table_name = 'COMMENT_ALL_TXT';

  DBMS_OUTPUT.PUT_LINE('1 key_column: ' || key_column);

END 
; 

【问题讨论】:

  • 如果我的问题有问题,请发表评论让我知道。给出没有评论的 -1 没有帮助。
  • 不是dv,但请出示程序代码。您是否在同一架构中运行直接查询和存储过程?
  • 感谢老程序员的推荐。我在同一个模式中运行直接查询和存储过程。
  • 您运行存储过程的架构是否与“TAS”不同?
  • Possible duplicate 如果权限来自角色。

标签: oracle variables stored-procedures


【解决方案1】:

如果您从相同的模式运行该过程,它应该不会出错。
请检查随附的屏幕截图。我只是复制了你的场景。
请与我的代码交叉检查您的代码。谢谢。

确保您的架构名称正确。我的意思是,您正在同一架构下检查两者。然后结果将是相同的。

【讨论】:

  • 感谢 smshafiqulislam 的回答。当我运行直接查询时,我运行它作为“MMW1164”连接到数据库,并且在过滤模式“TAS”时它可以工作。当我创建程序时,它的架构是“MMW1164”,它正在尝试查询架构“TAS”,但显然没有任何价值。
  • 这个查询的输出是什么? SELECT cols.column_name FROM all_constraints cons INNER JOIN all_cons_columns cols ON cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner AND cons.constraint_type = 'P' WHERE cons.owner = 'TAS' AND cols.table_name = 'COMMENT_ALL_TXT ';
  • 我分享了屏幕截图供您参考。它应该工作。 :) 只需分享“MMW1164”下查询的输出是什么
  • 您好 smshafiqulislam。当我在 Oracle SQL 开发人员中运行该查询时,它返回“COM_ALL_TXT_KEY”。当同一查询在过程中运行并尝试将值保存到变量中时,该变量为空。这一定与该过程在模式“MMW1164”中但查询试图过滤所有者 = 'TAS'这一事实有关。我只是不明白它是如何用于直接查询的,但不是在过程中。
  • 哦,我明白了。我有你的问题。如果要查看位于一个模式中的其他模式的约束信息,则需要 dba 权限。 MMW1164 需要 dba 权限。只需运行一次“grant dba to MMW1164”即可​​检查。
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 2011-04-19
  • 1970-01-01
  • 2010-11-23
  • 2016-07-26
  • 2012-10-05
  • 2010-10-15
  • 2021-09-28
相关资源
最近更新 更多