2017-02-24 55 views
-1

我使用Oracle Apex 4.2和數據庫11.g.我需要將從用戶接收的值(l_requested_time)與存儲在表列中的值(music_lookup.valid_time)進行比較。如果提供的值包含在表中,則交易應繼續。如果提供的值不在表格中,那麼交易應該被取消。我在將它放入Apex之前,先在SQL Developer中構建它。當我在SQL Developer中執行以下代碼時,我收到一條錯誤消息:PLS-00405:在此上下文中不允許使用子查詢。我只是不知道如何解決這個限制。PL/SQL在表中使用IN子句

Declare 
    l_requested_time varchar2(256); 
Begin 
    l_requested_time := '10:00 AM'; 
    If l_requested_time in (select valid_time from music_lookup) 
    Then dbms_output.put_line('The transaction is authorized'); 
    Else dbms_output.put_line('The transaction is NOT authorized'); 
    End if; 
End; 

有沒有更好的方法來解決這個問題?

感謝您關注此事。

回答

1

有幾件事。

  1. 您的PL/SQL邏輯在語法上是錯誤的。你需要做一些像
Declare 
    l_requested_time varchar2(256); 
    junk varchar2(1); 
Begin 
    l_requested_time := '10:00 AM'; 
    select 'x' into junk from music_lookup where requested_time = l_requested_time; 
    dbms_output.put_line('The transaction is authorized'); 

exception 
    when no_data_found then 
    dbms_output.put_line('The transaction is NOT authorized'); 
End; 

現在,實際上是會產生錯誤的另一個條件;如果有不止一行表示我的狀況呢? 我懷疑還有更多要查詢的時間;例如user_id?

  1. 對於日期/時間,您應該使用DATE(或TIMESTAMP)數據類型。
+0

嗨BobC,謝謝你的回覆。對此,我真的非常感激。這是一個很好的方法,並且工作正常。回答您的其他問題:1)查詢不應該返回多行,因爲基於Requested_Time和UserName字段的組合,我在music_lookup表上具有唯一鍵約束。組合鍵表示用戶有權編輯任何帶有包含當日時間的時間戳的記錄。 2)l_requested_time字段是從Timestamp字段中提取的。在我將它移到Apex之前,我沒有包含UserName,因爲我使用的是SQLDeveloper。再次感謝。 – user3138025