2017-02-24 201 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