首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Oracle sql Developer代码窗口中使用变量运行SQL代码

在Oracle sql Developer代码窗口中使用变量运行SQL代码
EN

Stack Overflow用户
提问于 2011-01-13 01:41:55
回答 2查看 56.3K关注 0票数 14

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

代码语言:javascript
复制
    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);

但是,我想向其中添加一些变量,并引用语句中的变量,如下所示,并在代码窗口中运行它。我怎样才能正确地做到这一点?

代码语言:javascript
复制
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窗口中运行它时,我得到以下消息:

代码语言:javascript
复制
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:
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-13 04:47:23

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

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

代码语言:javascript
复制
  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以使其保留该值,然后使用

代码语言:javascript
复制
UNDEFINE var 

要清除它

现在,您可以通过使用定义来在页面顶部设置这些设置(从而避免提示

代码语言:javascript
复制
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')"

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

票数 20
EN

Stack Overflow用户

发布于 2011-01-13 17:42:41

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

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

代码语言:javascript
复制
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);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4672019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档