我通常每天都会进行此查询:
select * from table1
where name = 'PAUL';
select * from table2
where id_user = 012345;
select * from table25
where name = 'PAUL';
select * from table99
where name = 'PAUL';
select * from table28
where id_user = 012345;
.
.
.
我每天都会这样查询。今天是15个表,明天可能是20个,唯一的变化是要搜索的用户的名称或ID。我必须在每个查询中放置用户名或ID,所以我需要一个查询,其中有一个变量并分配名称和ID。 。 。 有一种方法可以简化此查询并使其更好吗?如:
DECLARE
l_name table1.name %type;
l_id_user table28.id_user %type;
BEGIN
l_id_user := 012345;
l_name := 'PAUL';
select * from table1
where name in ('l_name');
select * from table2
where id_user in (l_id_user);
.
.
.
END;
我试过这种方式却失败了。我需要这个查询,因为在大多数情况下需要查看多达20个表或更多。
答案 0 :(得分:1)
如果您想要的是在SQL * Plus中重复运行一系列select语句的简单方法 - 但是根据不同的标准,您可以这样做:
ACCEPT l_name PROMPT "Input user name: "
ACCEPT l_id_user PROMPT "Input user id: "
select * from table1
where name = '&l_name';
select * from table2
where id_user = &l_id_user;
select * from table25
where name = '&l_name';
select * from table99
where name = '&l_name';
select * from table28
where id_user = &l_id_user;
在pl / sql块declare ... begin .. end;
中,select语句的行为与在SQL * Plus中独立运行时的行为不同:
FOR LOOP
语法的SELECT INTO
或变体,用于捕获后续处理的结果。你应该找一些关于pl / sql编程的文档。你应该明白pl / sql绝对不是为屏幕输出而设计的。
可以使用dbms_output.put_line
打印出字符串值,但您可以完全依靠将一行值格式化为合适的字符串。
如果您的结果包含多个列,则屏幕输出的格式变得非常麻烦,因为您没有像Java String.format()
这样的格式化实用程序来帮助您。
如果你的结果包含多行,你必须提供某种循环结构,允许你打印出各行。
Conlusion:
这些是pl / sql的缺点 - 我真的没有任何好处 - 除非您的目标是对正在读取的数据应用一些逻辑,而不是仅将其打印到屏幕或文件。