【问题标题】:Run sql code with variables in Oracle SQL Developer code window在 Oracle SQL Developer 代码窗口中运行带有变量的 sql 代码
【发布时间】:2011-06-08 00:08:25
【问题描述】:

我正在使用 Oracle SQL Developer 编写代码。我有一个简单的选择语句有效:

    SELECT
      CFS.CAE_SEC_ID,
      CFS.FM_SEC_CODE,
      CFS.LAST_USER_ID,
      case 
          when 1 = 1 then
            sl.usbank_to_edit
          else
            case 
              when 'ENT\CB174' = CFS.last_user_id then
                sl.owner_to_edit
              else
                sl.to_edit
            end
        end canEdit
    FROM
    CAEDBO.CAE_FOF_SECURITY CFS
    INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
        ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS)
    INNER JOIN caedbo.CAE_STATE_LOOKUP sl 
        ON (sl.object_state =  CDSE_STAT.data_set_element_id)
   where 
      cfs.CAE_SEC_ID in (3741, 3744, 3748, 3752);

但是我想向它添加一些变量并引用语句中的变量,类似于下面,并在代码窗口中运行它。我该如何正确地做到这一点?

DECLARE 
  p_USBank_n NUMBER;
  p_user_id_c VARCHAR2(20);
BEGIN  
  p_USBank_n := 1; 
  p_user_id_c := 'ENT\CB174';

    SELECT
      CFS.CAE_SEC_ID,
      CFS.FM_SEC_CODE,
      CFS.LAST_USER_ID,
      case 
          when p_USBank_n = 1 then
            sl.usbank_to_edit
          else
            case 
              when p_user_id_c = CFS.last_user_id then
                sl.owner_to_edit
              else
                sl.to_edit
            end
        end canEdit
    FROM
    CAEDBO.CAE_FOF_SECURITY CFS
    INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
        ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS)
    INNER JOIN caedbo.CAE_STATE_LOOKUP sl 
        ON (sl.object_state =  CDSE_STAT.data_set_element_id)
   where 
      cfs.CAE_SEC_ID in (3741, 3744, 3748, 3752);
END;

当我在 sql 窗口中运行时,我收到以下消息:

Error report:
ORA-06550: line 8, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

【问题讨论】:

  • 呃,如果我能弄清楚,那我就不会问我会不会..那是什么愚蠢的评论?如果你没有什么建设性的话请不要说什么,谢谢

标签: oracle plsql oracle-sqldeveloper


【解决方案1】:

错误信息说明了问题;在 PL/SQL 块中,您必须选择 INTO 某些东西,而且您不能像使用普通 SQL 那样将查询结果转储到屏幕上。 (有很多方法可以做到这一点,但对于您在这里想要实现的目标来说可能过于复杂)。

如果您不想像@Harrison 建议的那样使用替换变量,您可以使用您在开始时在单独的匿名块中定义的绑定变量。然后您可以在纯 SQL 中引用绑定变量:

var p_usbank_n number;
var p_user_id_c varchar2(20);

exec :p_usbank_n := 1;
exec :p_user_id_c := 'ENT\CB174';

select
    cfs.cae_sec_id,
    cfs.fm_sec_code,
    cfs.last_user_id,
    case 
        when 1 = :p_usbank_n then
            sl.usbank_to_edit
        when cfs.last_user_id = :p_user_id_c then
            sl.owner_to_edit
        else
            sl.to_edit
    end as canEdit
from
    caedbo.cae_fof_security cfs
inner join caedbo.cae_data_set_element cdse_stat 
    on (cdse_stat.data_set_element_id = cfs.appr_status)
inner join caedbo.cae_state_lookup sl 
    on (sl.object_state =  cdse_stat.data_set_element_id)
where 
    cfs.cae_sec_id in (3741, 3744, 3748, 3752);

【讨论】:

  • 嗨,Alex,现在回到这个话题。即使在代码中指定了值,上面的代码也会提示我输入值。知道为什么会这样吗?
  • @Ciaran:在 SQL Developer 中,您是否正在执行“运行”(它将在标题为“输入绑定”的窗口中提示,因为它只运行当前语句);或“运行脚本”(F5)?您需要执行后者以使其将varexecselect 作为一个单元运行。 @Harrison 的 define 版本也是如此 - 如果您“运行”,系统会提示您输入替换变量。
  • 在 SQL Developer 版本 3.0.02 中,如果您突出显示/选择带有替换变量的整个块以及查询,则不会提示您 (run=F9)
  • @Harrison:哎呀,是的,我在之前运行的快速版本中有错字; 2.1.1 也一样。所以我之前的评论只适用于绑定变量,而不是替换变量。谢谢。
【解决方案2】:

如果我没看错,我想你在找Oracle Substitution variables.

这将提示您每次输入值,使用 &val 它会提示您@runtime

  SELECT
      CFS.CAE_SEC_ID,
      CFS.FM_SEC_CODE,
      CFS.LAST_USER_ID,
      CASE 
          when &p_USBank_n = 1 then
            sl.usbank_to_edit
          else
            CASE 
              when '&p_user_id_c' = CFS.last_user_id then
                sl.owner_to_edit
              else
                sl.to_edit
            end
        end canEdit
    FROM
    CAEDBO.CAE_FOF_SECURITY CFS
    INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
        ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS)
    INNER JOIN caedbo.CAE_STATE_LOOKUP sl 
        ON (sl.object_state =  CDSE_STAT.data_set_element_id)
   where 
      CFS.CAE_SEC_ID IN (3741, 3744, 3748, 3752);

将其更改为 &&var 以使其保留该值,然后使用

UNDEFINE var 

清除它

现在您可以通过使用 DEFINE 将这些设置在页面顶部(从而避免提示)

DEFINE XYZ = 5
DEFINE AAA = to_date('10/10/2010','mm/dd/rrrr')
DEFINE textString = AaBbCc

SELECT &&XYZ b, &&AAA a, '&&textString' textString
  from dual ;

  B                      A                         TEXTSTRING 
  ---------------------- ------------------------- ---------- 
  5                      10.OCT.2010 00:00         AaBbCc     
  --typing define will show you all the "defined" values 
define

  DEFINE XYZ = "5"
  DEFINE TEXTSTRING = "AaBbCc"
  DEFINE AAA = "to_date('10/10/2010','mm/dd/rrrr')"

双和号将“保留”该值,直到您取消定义它(见上文)或重新定义它。

【讨论】:

  • 感谢您所说的确实有效+1,但我想在页面顶部声明变量。我的查询是一个更大的查询的一部分,其中包含多个变量,因此每个变量都会提示一些痛苦
  • @Ciaran Bruen,您可以使用“DEFINE”绕过提示(编辑和示例见上文)
  • 感谢您的更新,非常感谢。由于两个答案都正确,不确定将哪一个标记为答案?
  • @Ciaran Bruen,将您最喜欢的一个标记为正确的,您将使用的那个。选择亚历克斯的好答案不会流泪!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2018-02-21
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多