【问题标题】:Oracle issue joining pipelined dataOracle 问题加入管道数据
【发布时间】:2021-08-03 13:28:07
【问题描述】:

我正在尝试设置一个测试 CASE,它调用一个基于 DATE 范围返回日期的流水线函数。我的目标是每个日期都有一行。

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

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

错误:PROCEDURE CREATE_DATA 行/列:8/10 PL/SQL:忽略 SQL 语句 行/列: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');

【问题讨论】:

    标签: oracle pipeline procedure


    【解决方案1】:

    您的表格要求每行有一个 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;
    /
    

    【讨论】:

    • @MTO 谢谢。我知道有很多约会,但不确定如何继续
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多