oracle 12c, использующее предложение факторинга подзапроса с объявлением plsql

Я большой поклонник предложения факторинга подзапроса.

WITH t1 as (select 1 as id from dual)
select * from t1;

и oracle 12c теперь включает в себя раздел объявления PL/SQL в предложении WITH

WITH
  FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURN p_id;
  END;
SELECT with_function(id)
FROM   t1
WHERE  rownum = 1

но я не могу заставить их работать вместе, возможно?

WITH t1 as (select 1 as id from dual)
WITH  FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURN p_id;
  END;
SELECT with_function(id)
FROM   t1
WHERE  rownum = 1;

1 ответ

Решение

Пожалуйста, обратитесь к синтаксису:
https://docs.oracle.com/database/121/SQLRF/statements_10002.htm

plsql_declarations

subquery_factoring_clause

Как видите, синтаксис:

WITH [ plsql_declarations ] [ subquery_factoring_clause ]

Это означает, что PL / SQL должен идти первым, а затем оставшийся SQL-запрос, следующим образом:

WITH 
  FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURN p_id;
  END;
t1 as (select 1 as id from dual)
SELECT with_function(id)
FROM   t1
WHERE  rownum = 1;
Другие вопросы по тегам