【问题标题】:Variables in TOAD scriptsTOAD 脚本中的变量
【发布时间】:2010-12-29 04:05:36
【问题描述】:

我有一个在 TOAD 中执行的 SQL 脚本。目前,我只是用一个又一个的语句来阐述它,因此:

select such-and-such from somewhere;

delete other-thing from somewhere-else;

等等。一些 where 子句最终是重复的,因为我有复杂的内部查询来获取要操作的特定 ID。我想在一个变量中捕获脚本开头的 ID,然后在后续的 where 子句中使用该变量。所以是这样的:

variable MY_ID = select the-ID from somewhere;

select such-and-such from somewhere where ID = @MY_ID;

显然,我正在编造这种语法,但这正是我要寻找的。但我不确定这在 TOAD 脚本中是否可行。我知道我可以将整个内容转换为 PL/SQL 块,但我试图避免由于各种原因不得不这样做。

有什么方法可以在不转换为 PL/SQL 块的情况下使用 TOAD?

【问题讨论】:

  • 我无法提供答案,因为我不熟悉 TOAD,但是您不使用 PLSQL 的原因是什么?
  • 不切换到 PL/SQL 有几个原因。一是它已经完成了 90%,我不想花时间转换。二是根据我的经验,PL/SQL 脚本更难调试,也更难一次“单步执行”一个语句。这可能是我缺乏知识,因为我不是 PL/SQL 专家。第三,我将这个脚本交给其他人,根据我的经验,“简单”的 SQL 脚本比 PL/SQL 更容易处理。

标签: sql oracle plsql toad


【解决方案1】:

我认为这将完成您想要的。您可以声明一个绑定变量,向其中插入一个值,然后在以后的语句中使用它。

variable l_var varchar2(1);

begin
  select dummy
    into :l_var
    from dual;
end;

select *
  from dual
 where dummy = :l_var;

【讨论】:

    【解决方案2】:

    我使用 SQL*PLUS 替换变量。它们由 TOAD 支持。 您可以通过按 F5 来执行此代码。

    COLUMN VAR NEW_VALUE VAR_VALUE
    
    SELECT 'SOMETHING' VAR FROM DUAL;  --this sets 'VAR_VALUE' = 'SOMETHING'
    
    SELECT '&VAR_VALUE' FROM DUAL;  --this uses the value set by the previous stmt.
    

    【讨论】:

    • 正如所写,这也是一个很好的答案:您甚至可以拥有多个变量,并且整个事情都可以在 Toad 中作为脚本运行。上述答案中的最后一条语句可以作为单个查询自行执行,Toad 会提示您输入每个 &-type 变量;但是,即使您的所有变量都具有相同的名称,Toad 也会提示您输入每一个变量。
    【解决方案3】:

    我不再积极使用 TOAD,但应该有一些机制来设置绑定参数的值,即select such-and-such from somewhere where ID = :myid;,这样每次它发生时,TOAD 都会为该参数提供相同的值。

    或者,您可以创建会话上下文值或 PL/SQL 包变量(注意:与重写整个代码以使用 PL/SQL 不同)。见this question

    【讨论】:

    • 我知道您指的是绑定变量。但是,我想捕获不同选择语句的值。每次我运行脚本时,该变量都可能是不同的值。
    • 所以每次运行时只需在开始时进行不同的设置。如果你走包路线(以 Thomas Jones-Low 为例),那么让你的第一条语句开始 foo.myVar := 'whatever I want this time';结束;
    【解决方案4】:

    如果使用正确,TOAD 中的“计算字段”功能实际上非常强大。它只不过是一个附加到查询本身的“令牌”脚本编辑器。它只能通过查询设计编辑器使用,不能通过本机编辑器使用,后者允许您直接编写 SQL。

    作为提示,下次您创建在 TOAD 中设计的查询并需要创建复杂的 WHERE 或子查询时,请尝试“计算字段”功能并使用 FORMS 选项将您的条件基本上附加到给定的列或查询.你会惊讶于它的强大。它还有助于使您的 SQL 查询保持可读的格式。

    【讨论】:

      【解决方案5】:

      当我使用 CASE 句子名称 AS Ticket 的结果进行“分组”时,Toad 显示错误,提示 Ticket in not a valid item,

      SELECT 
      CASE WHEN ( amt_1 >= 10000000                             ) THEN  'R100000'
           WHEN ( amt_1 <   9000000 and amt_1 >=  8000000       ) THEN  'R090000'
           WHEN ( amt_1 <   8000000 and amt_1 >=  7000000       ) THEN  'R080000'
           WHEN ( amt_1 <   7000000 and amt_1 >=  6000000       ) THEN  'R070000'
           WHEN ( amt_1 <   6000000 and amt_1 >=  5000000       ) THEN  'R060000'
           WHEN ( amt_1 <   5000000 and amt_1 >=  4000000       ) THEN  'R050000'
           WHEN ( amt_1 <   4000000 and amt_1 >=  3000000       ) THEN  'R040000'
           WHEN ( amt_1 <   3000000 and amt_1 >=  2000000       ) THEN  'R030000'
           WHEN ( amt_1 <   2000000 and amt_1 >=  1000000       ) THEN  'R020000'
           WHEN ( amt_1 <   1000000 and amt_1 >=  500000        ) THEN  'R010000'
           WHEN ( amt_1 <    500000 and amt_1 >=  100000        ) THEN  'R005000'
           WHEN ( amt_1 <    100000                             ) THEN  'R001000'             
      END  as Ticket,    
      CAST ( SUM(AMT_1/100) AS DECIMAL(10,2) )  
      Count(*)     
      FROM BASE24.PTLF 
      GROUP BY  Ticket
                         
      

      【讨论】:

      • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 2015-06-25
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      相关资源
      最近更新 更多