PL/SQL 和 SQL 开发人员彼此的结果不同

PL/SQL and SQL Developer different results from each other

我正在 PL/SQL 版本 7 和版本 14 中执行查询,使用我创建的函数,都给我带来了一些结果,其余的带来了 0。 但是,在 Oracle SQL Developer 中执行相同的查询时,该查询会正确显示所有结果。

我也通过 PL / SQL 和 Oracle SQL Developer 执行了该过程,但是 none 给我带来了正确的结果,所有行都保留为“0” . 我根本找不到问题,即使在 Google.

基本上,该函数将行数乘以以“ID_”开头的列数,如下所示。

函数:

CREATE OR REPLACE FUNCTION DS_FUNCESP.FNBIGB_CheckDataCells
(pOwn IN VARCHAR2, 
 pTab IN VARCHAR2)
RETURN NUMBER 
IS

 v_Qtd NUMBER;
 v_str VARCHAR2(2000);
 
BEGIN
   v_Qtd := 1;
   v_str := ' SELECT
                SUM((SELECT COUNT(1) AS QTY_ROWS FROM ' || pOwn || '.' || pTab || ' d WHERE d.LINORIGEM <> ''CARGA MANUAL'')) AS QTY_DATA
              FROM DW_FUNCESP.D_BI_COLUMNS a
                LEFT JOIN
                  DW_FUNCESP.D_BI_TABLES b
                  ON a.ID_TABLE  = b.ID_TABLE
                  AND a.ID_OWNER = b.ID_OWNER
                LEFT JOIN DW_FUNCESP.D_BI_OWNERS c
                  ON a.ID_OWNER  = c.ID_OWNER
              WHERE b.NM_TABLE = ''' || pTab || '''
              AND a.IN_PRIMARYKEY       = ''NAO''
              AND SUBSTR(a.NM_COLUMN,1,3) = ''ID_'' ';

   DBMS_OUTPUT.put_line(v_str);
   EXECUTE IMMEDIATE v_str into v_Qtd ;

   return (v_Qtd);
  
EXCEPTION WHEN OTHERS THEN
       RETURN 0;
       
END FNBIGB_CheckDataCells;

Select 语句:

SELECT
  c.NM_OWNER ,
  b.NM_TABLE ,
  DS_FUNCESP.FNBIGB_CHECKDATACELLS(c.NM_OWNER, b.NM_TABLE) AS QTY_DATA
FROM DW_FUNCESP.D_BI_TABLES b
  LEFT JOIN DW_FUNCESP.D_BI_OWNERS c
    ON b.ID_OWNER = c.ID_OWNER;

来自 PL/SQL 的结果:

来自 Oracle SQL 开发人员的结果:

很明显,我们可以从任何一行中看出差异,右边的是 Oracle SQL Developer。所以我想知道问题是什么,如何解决,因为无论我在哪里 运行.

,程序都会向所有行添加“0”

阅读来自 WHEN OTHERS - A Bug 的示例,感谢@Lalit Kumar B,我更改了:

EXCEPTION WHEN OTHERS THEN
       RETURN 0;

收件人:

EXCEPTION 
   WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('SQLCODE: '||SQLCODE);
        DBMS_OUTPUT.PUT_LINE('Message: '||SQLERRM);
        RAISE;

为了找出问题所在,感谢您的帮助,我发现它正在尝试从 table 开始计数,但它已不存在。

所以我使用如下错误处理,来自 @Jeffrey Kemp

EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;

另外,感谢@Belayer,我的代码是问题所在,同意这一点。此外,在这两种软件上执行,让我更加困惑。我肯定还会阅读该文档。