Stored procedures PL/SQL:,如何将变量传递到SELECT语句并返回所有结果行

Stored procedures PL/SQL:,如何将变量传递到SELECT语句并返回所有结果行,stored-procedures,plsql,oracle-sqldeveloper,Stored Procedures,Plsql,Oracle Sqldeveloper,我正在使用oracle数据库。我熟悉SQL server,但不熟悉Oracle数据库的PL/SQL。 我如何设置一个返回包含该变量值的所有行的变量:我迷路了,我试图理解,但对我来说没有意义。这是我最近的一次尝试 DECLARE date1 varchar(40); Begin Select '''07/31/2013_09%''' into :date1 from dual; End; / print date1 Begin Select * from TABLE1 where start_

我正在使用oracle数据库。我熟悉SQL server,但不熟悉Oracle数据库的PL/SQL。 我如何设置一个返回包含该变量值的所有行的变量:我迷路了,我试图理解,但对我来说没有意义。这是我最近的一次尝试

DECLARE date1 varchar(40);
Begin
Select '''07/31/2013_09%''' into :date1 from dual;
End;
/
print date1


Begin
Select * from TABLE1 where start_time LIKE date1;
End;
/
我应该从中返回所有行。
谢谢您的帮助。

您必须创建一个参数化光标,并将该日期作为参数传递给该光标,如下所示

   CREATE or REPLACE procedure proc1(p_date date)
   as
        CURSOR C1 (date1 date)is
              SELECT * from TABLE1 where start_time LIKE date1;
  BEGIN
      FOR i in c1(p_dat)
      LOOP
        .......
      END LOOP;
      END;

这可能有助于您开始:

create table table1 (
  start_time varchar2(10),
  foo        number
);

insert into table1 values ('xyz', 1);
insert into table1 values ('wxy', 2);
insert into table1 values ('abc', 3);

create type table1_obj as object (
  start_time varchar2(10),
  foo        number
);
/

create type table1_tab as table of table1_obj;
/


declare
  v table1_tab;
begin

  select table1_obj(start_time, foo) bulk collect into v
   from table1 where start_time like '%x%';
end;
/

看起来您缺少对几个基本构件的理解:

  • 您需要一个PL/SQL数据结构,用于保存从数据库表中查询的数据集:。请特别参阅嵌套表和记录变量
  • 您可以使用查询数据库。请特别参阅
    选择进入
    语句。在这种情况下,不需要动态SQL
  • 但当然,从数据库中获取一组行比仅获取一行要困难一些。这里的关键字是:。请注意,根据查询和表大小,大容量收集可能会耗尽服务器的内存(通过加载数百万行)
下面是一个示例,可以为您提供一个kickstart:

create table so26 (
  day date,
  event varchar(10)
);

insert all
into so26 values(trunc(sysdate - 1), 'foo1')
into so26 values(trunc(sysdate - 1), 'foo2')
into so26 values(trunc(sysdate - 1), 'foo3')
into so26 values(trunc(sysdate    ), 'bar')
into so26 values(trunc(sysdate + 1), 'zoo')
select 1 from dual;

select * from so26;

declare
  type event_list_t is table of so26%rowtype;
  v_events event_list_t := event_list_t();

  function get_events(p_day in date default sysdate) return event_list_t as
    v_events event_list_t := event_list_t();
  begin
    select *
      bulk collect into v_events
      from so26
     where day = trunc(p_day);

    return v_events;  
  end;
begin
  v_events := get_events(sysdate + 1);

  if v_events.first is null then
    dbms_output.put_line('no events on that day');
    return;
  end if;

  for i in v_events.first .. v_events.last loop
    dbms_output.put_line(i || ': event = ' || v_events(i).event);
  end loop;
end;
/
获取事件(sysdate-1)
时的输出示例:

1: event = foo1
2: event = foo2
3: event = foo3