我一直在互联网上挖掘,包括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子句。这甚至可能吗?我真的认为这将是一个简单的谷歌搜索,但也许我的虚弱的大脑忽略了一些东西。感谢。
答案 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
...