在 PLSQL 条件逻辑中使用子查询;错误 PLS-00405

Posted

技术标签:

【中文标题】在 PLSQL 条件逻辑中使用子查询;错误 PLS-00405【英文标题】:Using a subquery within PLSQL conditional logic; error PLS-00405 【发布时间】:2015-01-13 17:22:52 【问题描述】:

我正在构建一个使用 php 从 Oracle10g 数据库服务器获取数据的应用程序。我的输入表单有一系列复选框,它们通过数组提交到处理页面(代码过滤到相关元素):

<form>
   <input type="checkbox" name="p_queue_type[]" id="p_queue_type_CR" value="CR" class="subject_to_all toggle_subcategory required" required="">
   <input type="checkbox" name="p_queue_type[]" id="p_queue_type_HOLD" value="HOLD" class="subject_to_all toggle_subcategory required" required="">
</form>

处理页面调用 Oracle 过程,该过程使用自定义数据类型“STRING_TABLE”(CREATE OR REPLACE TYPE STRING_TABLE AS TABLE OF VARCHAR (1000);) 将 PHP 作为数组处理的复选框值转换为表。

我的程序将这些复选框作为传入参数“p_queue_type”(代码过滤到相关元素):

PROCEDURE get_TLFQ_results (
    p1                      OUT   SYS_REFCURSOR,
    p_queue_type            IN    STRING_TABLE
)
IS
    v_return_sql            VARCHAR2(32767) := '';
BEGIN
    IF ('HOLD' IN (SELECT COLUMN_VALUE AS queue_type FROM TABLE (p_queue_type))) THEN
        --compile query string
    END IF;
    IF ('CR' IN (SELECT COLUMN_VALUE AS queue_type FROM TABLE (p_queue_type))) THEN
        --compile query string
    END IF;

    -- Execute the query string and store the results in a cursor
    OPEN p1 FOR v_return_sql;
END get_TLFQ_results;

当我尝试编译我的程序时,我收到了这个 Oracle 错误:

[错误] PLS-00405 (4215: 23): PLS-00405: 在此不允许子查询 上下文

我做错了什么?如何在我的 PLSQL 条件逻辑中使用我的字符串表?

【问题讨论】:

【参考方案1】:

您不能以这种方式在 PL/SQL IF 条件中使用 SELECT 语句。但是你可以这样做:

IF ('HOLD'  member of p_queue_type) THEN
...

【讨论】:

我喜欢 *** 的另一个例子。谢谢,托尼。 如果子查询包含 where 子句,你会怎么做? (IF ('HOLD' IN (SELECT COLUMN_VALUE AS queue_type FROM TABLE p_queue_type where p_smthng = 'VALUE') THEN) ? @MrAdibou 在这种情况下,我认为您需要编写像SELECT COUNT(*) INTO var FROM TABLE (p_queue_type) WHERE COLUMN_VALUE = 'HOLD' and p_smthng = 'VALUE'; if var &gt; 0 then ...这样的代码

以上是关于在 PLSQL 条件逻辑中使用子查询;错误 PLS-00405的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 废话 (?) 包和包正文中的错误 PLS-00103

PLSQL:子查询之外的条件

PLSQL碰到pls-00103的错误解决办法

PLSQL - 游标不能在动态 sql 中使用

plsql 中的条件字符串,如 sprintf

PLS-00920: parameter plsql_native_library_dir is not set