PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行
Posted
技术标签:
【中文标题】PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行【英文标题】:PL/SQL:, How to pass variable into SELECT statent and return all rows of results 【发布时间】:2013-08-01 21:16:23 【问题描述】:我正在使用 oracle 数据库。我习惯使用 SQL 服务器,但不熟悉 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;
/
我应该得到所有从这里返回的行。 感谢您的帮助。
【问题讨论】:
【参考方案1】:这可能会帮助您入门:
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;
/
【讨论】:
【参考方案2】:您必须创建一个参数化光标并将该日期作为参数传递给该光标,如下所示。
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;
【讨论】:
【参考方案3】:您似乎缺少对几个基本构建块的理解:
您需要一个 PL/SQL 数据结构,用于保存从数据库表查询的数据集:PL/SQL Collections and Records。尤其是嵌套表和记录变量。 您使用PL/SQL Static SQL 查询数据库。尤其是SELECT INTO
声明。在这种情况下,不需要动态 SQL。
当然,从数据库中获取一组行比只获取一行要困难一些。这里的关键字是:SELECT INTO Statement with BULK COLLECT Clause。请注意,根据您的查询和表大小,批量收集可能会耗尽服务器的内存(通过加载数百万行)。
下面是一个示例,可以帮助您快速入门:
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;
/
get_events(sysdate - 1)
时的示例输出:
1: event = foo1
2: event = foo2
3: event = foo3
【讨论】:
以上是关于PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行的主要内容,如果未能解决你的问题,请参考以下文章
在 PL/SQL 存储过程中将多个变量传递给 WHERE 条件
变量作为 Oracle PL/SQL 中 where 子句中的列名