【问题标题】:Use Output of Oracle SQL Function in WHERE condition of SQL query在 SQL 查询的 WHERE 条件下使用 Oracle SQL 函数的输出
【发布时间】:2019-04-26 01:58:14
【问题描述】:

我编写了一个 Oracle SQL 函数,它将以以下格式返回 EMP ID。

Query: select CUSFNC_GETEMPID('HIGH-RATED') from dual;

Output: ('1436','1444','1234')

我想在 SQL Query 中使用这个输出如下:

SELECT ID, NAME, SAL
FROM EMP
WHERE ID IN CUSFNC_GETEMPID('HIGH-RATED')

我希望此查询返回 ID 等于上述查询中提到的值的记录。

但它没有按预期工作。

如何通过修改函数的输出或其他方式来实现?

【问题讨论】:

  • SQL 不是这样工作的。您需要在动态 SQL 中执行此操作(即execute immediate)。相反,您可以使用表值函数而不是返回字符串。
  • 函数是如何定义的(输出类型)?
  • 一个字符串变量

标签: sql oracle sql-function


【解决方案1】:

您可以使用连接代替 IN 子句

    SELECT ID, NAME, SAL
    FROM EMP
    inner join  (
        select CUSFNC_GETEMPID('HIGH-RATED') hrated from dual;
    ) t on t.hrated  = emp.id

可能你的 emp.id 是一个数字,所以你应该转换为 char

    SELECT ID, NAME, SAL
    FROM EMP
    inner join  (
        select CUSFNC_GETEMPID('HIGH-RATED') hrated from dual;
    ) t on t.hrated  = to_char(emp.id)

【讨论】:

    【解决方案2】:

    您可以使用PIPELINED TABLE FUNCTION,如下所示:

    CREATE FUNCTION CUSFNC_GETEMPID(param1 varchar2) RETURN DBMSOUTPUT_LINESARRAY PIPELINED AS 
    BEGIN
      FOR a_row IN 
      (
        -- YOUR SQL WHICH RETURNS ROWS WITH ID VALUES HERE...
        SELECT id
        FROM 
        (
          SELECT '1' id, 'HIGH-RATED' col FROM dual UNION 
          SELECT '2' id, 'HIGH-RATED' col FROM dual UNION 
          SELECT '3' id, 'LOW-RATED'  col FROM dual 
        )
        WHERE col = param1 -- FILTER BASED ON INPUT PARAM...
      )
      LOOP
    
        PIPE ROW(a_row.id); -- PUT THE ID COLUMN HERE...
    
      END LOOP;
    END;
    /
    

    然后像这样在你的 SQL 中调用它:

    SELECT ID, NAME, SAL
    FROM EMP
    WHERE ID IN (SELECT column_value FROM TABLE(CUSFNC_GETEMPID('HIGH-RATED')))
    

    【讨论】:

      【解决方案3】:

      选择 ID、姓名、SAL 来自 EMP WHERE ID IN (SELECT CUSFNC_GETEMPID('HIGH-RATED')AS ID FROM DUAL)

      【讨论】:

        猜你喜欢
        • 2019-12-09
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多