Oracle 问题加入流水线数据

Oracle issue joining pipelined data

我正在尝试设置一个测试 CASE,它调用一个流水线函数,returns 根据 DATE 范围确定日期。我的目标是每个日期都有一行。

我在尝试创建过程时遇到以下错误(见下文)。我知道我必须加入传入的 p_id 和函数返回的结果,但我似乎无法弄清楚如何,因为没有 link 来加入它们。

有人可以提供正确的代码来解决这个问题并解释我做错了什么。预先感谢所有回答者和您的专业知识。

错误:程序CREATE_DATA Line/Col:8/10 PL/SQL:SQL 声明被忽略 Line/Col: 11/13 PL/SQL: ORA-00936: 缺少表达式

      CREATE OR REPLACE TYPE nt_date IS TABLE OF DATE;

    CREATE OR REPLACE FUNCTION generate_dates_pipelined(
      p_from IN DATE,
      p_to   IN DATE
    )
    RETURN nt_date  PIPELINED   DETERMINISTIC
    IS
      v_start DATE := TRUNC(LEAST(p_from, p_to));
      v_end   DATE := TRUNC(GREATEST(p_from, p_to));
    BEGIN
     LOOP
        PIPE ROW (v_start);
        EXIT WHEN v_start >= v_end;
        v_start := v_start + INTERVAL '1' DAY;
      END LOOP;
      RETURN;
    END       generate_dates_pipelined;

    CREATE TABLE data(
      d_id NUMBER(6),
      d_date DATE
    );

  CREATE OR REPLACE PROCEDURE create_data (
    p_id IN NUMBER,
    p_start_date  IN DATE,
    p_end_date   IN DATE
 )
 IS
 BEGIN
     INSERT INTO data (d_id, d_date) 
     VALUES 
      (p_id, 
        TABLE(        generate_dates_pipelined(p_start_date, p_end_date)
       ) c
    );
   END;

  EXEC create_data (1, DATE '2021-08-21', DATE '2021-08-30');

您的 table 每行需要一个 DATE;您正在尝试提供每行日期的集合。

您需要为集合的每一行 INSERT 并且可以使用 SELECT 语句来做到这一点:

CREATE OR REPLACE PROCEDURE create_data (
  p_id IN NUMBER,
  p_start_date  IN DATE,
  p_end_date   IN DATE
)
IS
BEGIN
  INSERT INTO data (d_id, d_date) 
  SELECT p_id,
         COLUMN_VALUE
  FROM   TABLE(generate_dates_pipelined(p_start_date, p_end_date));
END;
/