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,我的代码是问题所在,同意这一点。此外,在这两种软件上执行,让我更加困惑。我肯定还会阅读该文档。
我正在 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,我的代码是问题所在,同意这一点。此外,在这两种软件上执行,让我更加困惑。我肯定还会阅读该文档。