oracle PL/SQL变量语法混淆[已关闭]

6yt4nkrj  于 2023-05-22  发布在  Oracle
关注(0)|答案(1)|浏览(142)

**关闭。**此题需要debugging details。目前不接受答复。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
昨天关门了。
Improve this question
我在PL/SQL中传递变量的语法方面遇到了麻烦。我有两个变量,startDate和endDate,我想从一个表中填充,然后作为参数传递给一个函数。我可以声明和填充变量,但我似乎不能弄清楚如何传递吸盘。
这一切都发生在PL/SQL开发人员的SQL查询窗口中。这些代码最终将被存储为一个临时查询,以便其他人加载到IDE中并按需运行。
我尝试了以下两种方法,但都失败了,但有不同的例外情况。
第一次尝试

DECLARE startDate DATE; endDate DATE;
 
 BEGIN
  SELECT MIN(e.start_date) INTO startDate FROM employees e WHERE e.state = 'NY';
  SELECT MAX(e.end_date) INTO endDate FROM employees e WHERE e.state = 'NY';
  
  SELECT * FROM my_package.my_function(i_start_date => :startDate, i_end_date => :endDate);
 END;

例外:PLS-00428:此SELECT语句中需要INTO子句
第二次尝试

DECLARE startDate DATE; endDate DATE;
 
 BEGIN
  SELECT MIN(e.start_date) INTO startDate FROM employees e WHERE e.state = 'NY';
  SELECT MAX(e.end_date) INTO endDate FROM employees e WHERE e.state = 'NY';
 END;
 SELECT * FROM my_package.my_function(i_start_date => :startDate, i_end_date => :endDate);

例外:PLS-00103:遇到符号“SELECT”

ojsjcaue

ojsjcaue1#

您不需要使用PL/SQL,可以在SQL中完成所有操作:

SELECT mf.*
FROM   ( SELECT MIN(e.start_date) AS min_start_date,
                MAX(e.end_date) AS max_end_date
         FROM   employees e
         WHERE e.state = 'NY'
       ) e
       CROSS APPLY my_package.my_function(
         i_start_date => e.min_start_date,
         i_end_date   => e.max_end_date
       ) mf;

如果你确实想使用PL/SQL,那么你可以使用游标FOR循环:

DECLARE
  startDate DATE;
  endDate DATE;
BEGIN
  SELECT MIN(e.start_date),
         MAX(e.end_date)
  INTO   startDate,
         endDate
  FROM   employees e
  WHERE  e.state = 'NY';

  FOR r IN (SELECT *
            FROM   my_package.my_function(
                     i_start_date => startDate,
                     i_end_date   => endDate
                   ))
  LOOP
    DBMS_OUTPUT.PUT_LINE(r.column_value);
  END LOOP;
END;
/

或者只是将函数返回的集合赋给一个变量(并跳过SQL查询)。例如,如果函数返回SYS.ODCINUMBERLIST类型,则:

DECLARE
  startDate DATE;
  endDate   DATE;
  v_values  SYS.ODCINUMBERLIST;
BEGIN
  SELECT MIN(e.start_date),
         MAX(e.end_date)
  INTO   startDate,
         endDate
  FROM   employees e
  WHERE  e.state = 'NY';

  v_values := my_package.my_function(
    i_start_date => startDate,
    i_end_date   => endDate
  );

  FOR i IN 1 .. v_values.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(v_values(i));
  END LOOP;
END;
/

fiddle
或者,如果您使用的是SQL*Plus或SQL Developer,则可以在脚本中使用绑定变量:

VARIABLE startDate VARCHAR2(20)
VARIABLE endDate VARCHAR2(20)

BEGIN
  SELECT TO_CHAR(MIN(e.start_date), 'YYYY-MM-DD HH24:MI:SS'),
         TO_CHAR(MAX(e.end_date), 'YYYY-MM-DD HH24:MI:SS')
  INTO   :startDate,
         :endDate
  FROM   employees e
  WHERE  e.state = 'NY';
END;
/

SELECT *
FROM   my_package.my_function(
         i_start_date => TO_DATE(:startDate, 'YYYY-MM-DD HH24:MI:SS'),
         i_end_date   => TO_DATE(:endDate, 'YYYY-MM-DD HH24:MI:SS')
       );

相关问题