输入替代变量

时间:2013-11-08 15:07:39

标签: sql oracle

我有一个来自海外同事的sql声明,但是当我尝试运行它时会弹出一个显示“输入替换变量”的框。我该放什么?我的同事说他们没有得到同样的盒子。是什么导致这个消息?我提供以下声明。非常感谢任何帮助。

此外,第三行给出了一条消息,说明缺少右括号。

select SUBSTR(created_ts, 1, 7) as created_month, 
count(t1.id) as mops_created,
count(completed_ts <> '') as num_complete,
round(AVG(DATEDIFF(planning_complete_ts, created_ts)), 1) as average_created_to_planning_complete,
round(AVG(DATEDIFF(review_complete_ts, planning_complete_ts)), 1) as average_planning_complete_to_review_complete,
round(AVG(DATEDIFF(scheduling_complete_ts, planning_complete_ts)), 1) as average_planning_complete_to_scheduling_complete,
round(AVG(DATEDIFF(scheduled_ts, scheduling_complete_ts)), 1) as average_scheduled_for_x_days_out,
round(AVG(DATEDIFF(completed_ts, planning_complete_ts)), 1) as average_planning_complete_to_mop_complete,
round(AVG(planning_complete_num), 1) as average_num_times_planning_complete,
max(planning_complete_num) as max_planning_complete,
round(AVG(scheduling_complete_num), 1) as average_num_time_scheduled,
max(scheduling_complete_num) as max_scheduled_num
FROM
(select a.id, a.created_ts, a.scheduled_ts, work_start_ts, completed_ts
from TRAFFIC_ENG.DSIS_CC_MASTER as a 
WHERE 
                a.created_ts >= '2013-01-01 00:00:00'
AND 
                a.status_cc_options_id NOT IN (810, 820)) as t1
LEFT JOIN
(select a.id, max(c.orig_date) as review_complete_ts 
from 
                TRAFFIC_ENG.DSIS_CC_MASTER as a
INNER JOIN
                TRAFFIC_ENG.DSIS_CC_LOG_NOTE as c
                ON c.cc_master_id = a.id
                AND (c.cc_log_note_type_id = 8 OR c.note = 'Passed Review & submitted to Scheduling')
WHERE 
                a.created_ts >= '2013-01-01 00:00:00'
AND 
                a.status_cc_options_id NOT IN (810, 820)
GROUP BY a.id) as review_complete
ON review_complete.id = t1.id
LEFT JOIN
(
select a.id, min(c.orig_date) as planning_complete_ts 
from 
                TRAFFIC_ENG.DSIS_CC_MASTER as a
INNER JOIN
                TRAFFIC_ENG.DSIS_CC_LOG_NOTE as c
                ON c.cc_master_id = a.id
                AND (c.cc_log_note_type_id = 5 OR c.note = 'Submitted for Review')
WHERE 
                a.created_ts >= '2013-01-01 00:00:00'
AND 
                a.status_cc_options_id NOT IN (810, 820)
GROUP BY a.id

) as planning_complete
ON planning_complete.id = t1.id
LEFT JOIN
(
select a.id, (c.orig_date) as scheduling_complete_ts 
from 
                TRAFFIC_ENG.DSIS_CC_MASTER as a
INNER JOIN
                TRAFFIC_ENG.DSIS_CC_LOG_NOTE as c
                ON c.cc_master_id = a.id
                AND (c.cc_log_note_type_id = 7 OR c.note='Scheduled')
WHERE 
                a.created_ts >= '2013-01-01 00:00:00'
AND 
                a.status_cc_options_id NOT IN (810, 820)
GROUP BY a.id
) as scheduling_complete
ON scheduling_complete.id = t1.id
LEFT JOIN
(
select a.id, count(c.orig_date) as planning_complete_num 
from 
                TRAFFIC_ENG.DSIS_CC_MASTER as a
INNER JOIN
                TRAFFIC_ENG.DSIS_CC_LOG_NOTE as c
                ON c.cc_master_id = a.id
                AND (c.cc_log_note_type_id = 5 OR c.note = 'Submitted for Review')
WHERE 
                a.created_ts >= '2013-01-01 00:00:00'
AND 
                a.status_cc_options_id NOT IN (810, 820)
GROUP BY a.id

) as planning_complete_num
ON planning_complete_num.id = t1.id
LEFT JOIN
(
select a.id, count(c.orig_date) as scheduling_complete_num
from 
                TRAFFIC_ENG.DSIS_CC_MASTER as a
INNER JOIN
                TRAFFIC_ENG.DSIS_CC_LOG_NOTE as c
                ON c.cc_master_id = a.id
                AND (c.cc_log_note_type_id = 7 OR c.note='Scheduled')
WHERE 
                a.created_ts >= '2013-01-01 00:00:00'
AND 
                a.status_cc_options_id NOT IN (810, 820)
GROUP BY a.id
) as scheduling_complete_num
ON scheduling_complete_num.id = t1.id

GROUP BY created_month

3 个答案:

答案 0 :(得分:2)

你可以试试“SET DEFINE OFF”吗?

SQL> SET SERVEROUTPUT ON
SQL> SET DEFINE OFF
SQL> BEGIN
  2  DBMS_OUTPUT.PUT_LINE('A&B');
  3  END;
  4  /
A&B

PL/SQL procedure successfully completed.

答案 1 :(得分:2)

正如@the_slk所说,您可以使用substitution variables关闭set define off。这将阻止客户端将字符串&中的'Passed Review & submitted to Scheduling'解释为用户输入。听起来您可能正在使用SQL Developer,但许多SQL * Plus文档仍然相关。如果您正在使用其他客户端,则可能会优先关闭它。

问题的第二部分,关于“缺少右括号”,看起来可能是因为你的代码中有空行。我认为你的客户端正在处理代码的每个部分,用空行分隔,作为单独的语句 - 我按照格式化的方式制作了四个,但我不确定是否与错误完全一致。 SQL * Plus默认情况下会这样做。无论如何,只有最后一个块实际上正在被执行,但是如果它真的只是运行'GROUP BY created_month'你会得到一个不同的错误,所以无论你的客户是什么,它似乎表现得有点不同,或者你有更多之后的代码,你没有显示。

要使SQL * Plus忽略空行,并将由空白行分隔的代码视为一个块set sqlblanklines on。虽然SQL Developer不使用该设置,但仍允许您使用空行,因此您的客户端可能是其他内容,并且将使用相同的命令或具有自己的首选项。如果您使用的是与同事相同的客户端,请询问他们如何设置自己的偏好设置。如果您的客户端没有明显的方法来更改行为,那么从脚本中删除空行可能会解决此问题。

答案 2 :(得分:1)

存在&amp; '通过评论&amp;中的符号提交给Scheduling',它通常向sql工具表明你要替换该位置的变量。

如果您使用像Toad这样的图形工具,可以在View / Options / Prompt for Substitution Variables中关闭它。

相关问题