【问题标题】:Passing value from parameter to SQL Query将值从参数传递到 SQL 查询
【发布时间】:2018-01-30 18:07:36
【问题描述】:

我在早上的大部分时间里一直在互联网上挖掘,包括 Stack,试图弄清楚如何创建一个参数,然后设置它的值并将它传递到我的 Oracle SQL 中 where 子句中的各个位置.我似乎找不到我想要的东西。很有可能我没有正确地问这个问题,所以如果这是一个多余的问题,我深表歉意(看起来很可能是这样)。

这是我在 Oracle SQL Developer 中运行的 SQL:

SELECT t.mta_tenure_sub_type_code , t.mta_tenure_type_code , COUNT(t.tenure_number_id), SUM(t.area_in_hectares)
FROM   MTA_TENURE t
WHERE
       t.mta_tenure_type_code in ('M','P') AND
       to_char(t.issue_date, 'YYYY') <= '&year' AND
       (
          to_char(t.termination_date, 'YYYY') > '&year' OR
          t.termination_date IS NULL OR
          t.mta_termination_type_code = 'PROT'
       )
GROUP BY t.mta_tenure_sub_type_code, t.mta_tenure_type_code;

如您所见,我的查询中有两次“&year”,每次出现该变量时都会提示用户输入一个值。每个变量的值总是相同的年份(即每次弹出提示时,用户总是会输入相同的年份两次) 作为一个 python 程序员,我曾认为我可以通过设置使这个查询更有效'&year' 的参数,因此用户只需输入一次,该参数会将值传递给 where 子句。这甚至可能吗?我真的认为这将是一个简单的谷歌搜索,但也许我微弱的大脑忽略了一些东西。谢谢。

【问题讨论】:

标签: sql oracle variables parameter-passing oracle-sqldeveloper


【解决方案1】:

您可以按照@Glenn 的建议将&amp;year 引用替换为&amp;&amp;year;请参阅 SQL*Plus 文档中的 Avoiding Unnecessary Prompts for Values(其中大部分也适用于 SQL Developer)。

您也可以显式地define 替换变量,这允许您tailor the prompt

accept year number prompt 'Enter year'

SELECT t.mta_tenure_sub_type_code , t.mta_tenure_type_code ,
  COUNT(t.tenure_number_id), SUM(t.area_in_hectares)
FROM   MTA_TENURE t
WHERE
       t.mta_tenure_type_code in ('M','P') AND
       to_char(t.issue_date, 'YYYY') <= '&year' AND
       (
          to_char(t.termination_date, 'YYYY') > '&year' OR
          t.termination_date IS NULL OR
          t.mta_termination_type_code = 'PROT'
       )
GROUP BY t.mta_tenure_sub_type_code, t.mta_tenure_type_code;

或者您可以使用特定值定义变量,这样它根本不会提示:

define year=2018

如果你知道值,你也可以使用绑定variable

var year number
exec :year := 2018;

SELECT t.mta_tenure_sub_type_code , t.mta_tenure_type_code ,
  COUNT(t.tenure_number_id), SUM(t.area_in_hectares)
FROM   MTA_TENURE t
WHERE
       t.mta_tenure_type_code in ('M','P') AND
       to_char(t.issue_date, 'YYYY') <= :year AND
       (
          to_char(t.termination_date, 'YYYY') > :year OR
          t.termination_date IS NULL OR
          t.mta_termination_type_code = 'PROT'
       )
GROUP BY t.mta_tenure_sub_type_code, t.mta_tenure_type_code;

请注意,变量的前缀已从 &amp; 更改为 :

如果您愿意,可以将两者结合起来:

var year number
exec :year := &year;

...然后在查询中使用绑定而不是替换变量。


在任何一种情况下,我都可能将to_char(...) 值转换为数字,或者改用extract

...
       extract(year from t.issue_date) <= :year AND
       (
          extract(year from t.termination_date) > :year OR
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2013-08-02
    • 2015-04-25
    相关资源
    最近更新 更多