2011-01-12 6 views
13

Oracle SQL Developer를 사용하여 코드를 작성하고 있습니다. Oracle SQL Developer 코드 창에서 변수가있는 SQL 코드 실행

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); 

그러나 내가 몇 가지 변수를 추가하고 다음과 유사한 문에서 변수를 참조하고, 또한 코드 창에서 실행하려면 : 나는 작동하는 간단한 select 문을 가지고있다. 이 작업을 올바르게 수행하려면 어떻게해야합니까? 나는 SQL 창에서이 프로그램을 실행할 때

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; 

내가 얻을 아래의 메시지 : 내가 제대로이 글을 읽고 있어요 경우

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: 
+3

어를 내가 그 다음 내가 종류의 바보 같은 코멘트를 I..what 것이다 요청하지 않았을 것입니다 그것을 알아낼 수 있다면? 아무 말도하지 말고 건설적인 것이 없다면, 감사합니다. –

답변

19

, 당신이 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 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')" 

같은 DEFINE (위 참조)하거나 재정의.

+0

당신이 한 말에 감사드립니다. +1하지만, 페이지 상단의 변수를 선언하고 싶습니다. 내 쿼리는 여러 변수를 가진 훨씬 더 큰 것의 일부입니다. 각 하나에 통증이 있습니다. –

+2

@Ciaran Bruen, 'DEFINE'을 사용하여 프롬프트를 돌아볼 수 있습니다 (위의 편집 및 예제 참조). – Harrison

+0

감사합니다. 업데이 트가 많이 감사합니다. 두 답이 모두 맞으면 답으로 표시 할 항목이 무엇인지 모르시겠습니까? –

4

오류 메시지가 문제를 설명합니다. 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); 
+0

알렉스, 안녕하세요. 위의 코드는 값이 코드에 지정되어 있더라도 입력 값을 요구합니다. 왜 이런 생각일까요? –

+1

@Ciaran : SQL Developer에서 '실행'을하고 있습니까? (현재 명령문 만 실행하기 때문에 '입력 바인드'라는 창이 나타납니다.); 또는 '스크립트 실행'(F5)? 'var','exec' 그리고'select'를 하나의 단위로 실행하려면 후자를 할 필요가 있습니다. @ Harrison의'define' 버전에서도 마찬가지입니다. 'Run'이라면 대체 변수를 입력하라는 메시지가 나타납니다. –

+1

에서 SQL Developer 버전 3.0.02에서 대체 변수로 전체 블록을 강조 표시하거나 선택하라는 메시지가 나타나지 않을 경우 (실행 = F9) – Harrison