在EDB/Postgres中与带绑定变量的ORACLE QUERY等效

bq8i3lrv  于 2022-12-18  发布在  Oracle
关注(0)|答案(1)|浏览(91)

在Edb/Postgres中执行oracle查询的等价物是什么?

SELECT proc_start_date "Process Start Date",
       filename "Filename",
       event_source "Event Source",
       
FROM   Sample_table
WHERE  process_start_date BETWEEN (TRUNC(:eff_date, 'dd') - CAST(:1 AS INTEGER)) AND
                                  (TRUNC(:eff_date, 'dd') + 86399/86400) AND
       proc_end_date IS NOT NULL AND
       filename LIKE DECODE(:2, NULL, '%', '', '%', :2) AND 
       event_source LIKE DECODE(:3, NULL, '%', :3)
ORDER by 1, 2, 3

我应该做什么改变运行上述查询edb数据库使用perl的DBI。
我试着在edb下面:

SELECT proc_start_date "Process Start Date",
       filename "Filename",
       event_source "Event Source",
       
FROM   sample_table
WHERE  process_start_date BETWEEN (TRUNC(:eff_date, 'dd') - CAST(? AS INTEGER)) AND
                                  (TRUNC(:eff_date, 'dd') + 86399/86400) AND
       proc_end_date IS NOT NULL AND
       filename LIKE DECODE(?, NULL, '%', '', '%', ?) AND 
       event_source LIKE DECODE(?, NULL, '%', ?)
ORDER by 1, 2, 3

但是它抛出了错误,说有5个绑定变量,但只为3传递了值。另外,在edb上运行查询还需要其他更改吗?

k10s72fa

k10s72fa1#

但它抛出错误,称有5个绑定变量,但只为3传递了值。
因为您已经从命名绑定变量更改为未命名绑定变量,所以需要传递第二个和第三个绑定变量值两次。

SELECT proc_start_date "Process Start Date",
       filename "Filename",
       event_source "Event Source",
FROM   sample_table
WHERE  process_start_date BETWEEN (TRUNC(:eff_date, 'dd') - CAST(? AS INTEGER)) AND
                                                              -- ^ one
                                  (TRUNC(:eff_date, 'dd') + 86399/86400) AND
       proc_end_date IS NOT NULL AND
       filename LIKE DECODE(?, NULL, '%', '', '%', ?) AND 
                         -- ^ two                  ^ three
       event_source LIKE DECODE(?, NULL, '%', ?)
                             -- ^ four        ^ five
ORDER by 1, 2, 3

因此,如果您传递值1ab,则需要传递1aabb来绑定所有变量。
如果需要重写查询以避免DECODE,则:

SELECT proc_start_date "Process Start Date",
       filename "Filename",
       event_source "Event Source",
FROM   sample_table
WHERE  process_start_date BETWEEN (TRUNC(:eff_date, 'dd') - CAST(? AS INTEGER))
                              AND (TRUNC(:eff_date, 'dd') + 86399/86400)
AND    proc_end_date IS NOT NULL
AND    ( filename LIKE ? OR ? IS NULL OR ? = '' )
AND    ( event_source LIKE ? OR ? IS NULL OR ? = '' )
ORDER by 1, 2, 3
  • (然后你需要传入1aaabbb来绑定所有变量;但是,在Oracle中,''NULL是相同的,因此您不需要进行? = ''比较,可以将其删除并返回到第2个和第3个参数的2个副本。)*

相关问题