oracle 我如何在PostgreSQL中找到可行但在模式中不存在的函数?

wribegjk  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(147)

我刚刚接管了一个PostgreSQL数据库(版本:PostgreSQL 11.11 on x86_64-pc-linux-gnu,compiled by gcc(GCC)7.3.0,64-bit),该数据库是从Oracle数据库迁移而来的。在该数据库中,我可以运行一些Oracle特定的函数(而不是PostgreSQL中的内置函数)并获得正确的结果,没有任何错误,例如:

select nvl(null, 1);
select decode(1, 1, 'true', 0, 'false');

但是我找不到这些函数,即使我导出了整个模式,没有以下脚本:

select pg_get_functiondef(oid)
from pg_proc
where lower(proname) like '%nvl%';

并且在这个数据库中没有安装任何相关的扩展,如orafce。我如何找到这些函数的定义?x1c 0d1xx 1c 1d 1xx 1c 2d 1xx 1c 3d 1x

mlnl4t2r

mlnl4t2r1#

从输出中的列名来看,似乎NVLDECODE分别被转换为COALESCECASE。必须在某处定义这些转换。如果没有添加扩展,并且没有函数具有这些名称,则可能是创建PostgreSQL可执行文件的源被修改以执行这些转换。
COALESCE是标准SQL,相当于Oracle的NVL(Oracle支持两者)。
在PostgreSQL中没有与DECODE直接等价的;但是,它可以转换为CASE表达式。请记住,Oracle的DECODE将两个NULL视为等价。

DECODE(search_value, NULL, 'unknown', 0, 'false', 1, 'true', 'invalid');

CASE search_value
  WHEN 0 THEN 'false'
  WHEN 1 THEN 'true'
  ELSE
    CASE
      WHEN search_value IS NULL THEN 'unknown'
      ELSE 'invalid'
    END
END

相关问题