将值从参数传递到SQL查询

时间:2018-01-30 18:07:36

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

我一直在互联网上挖掘,包括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;

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

1 个答案:

答案 0 :(得分:2)

您可以将&year引用替换为&&year,以@Glenn建议;请参阅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;

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

如果您愿意,可以将两者合并:

var year number
exec :year := &year;

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

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

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