sql - 如何通过将参数传递给oracle pl / sql中的where子句来获取多条记录
问题描述
桌子 :
create table emp
(
E_ID number,
E_NAME varchar2(30)
);
select * from emp;
101 name1
102 name2
我的代码:
declare
v1 varchar2(30) := '101,102';
begin
for i in (select e_id,e_name
from emp
where e_id in (v1)) loop
dbms_output.put_line(i.e_id);
end loop;
end;
/
问题:
获取 ORA -01722:无效号码
请帮助理解这个问题并建议我解决方案。
解决方案
欢迎来到 SO。提问的好地方:我可以看到你想要做什么。从语法上讲,您尝试使用“IN”子句查询表是可以原谅的,但正如其他人所说,这不能在您将数值提交到 varchar2 的情况下完成。无论如何,数组或集合(即使您已经创建了一个)在这里都不是一个简单的选择。但是您确实有多种解决方案可供您使用:
1/ 将您的数字放入一个数组并在循环中使用条件并检查 e_id 是否构成您的数组的一部分。但不优雅!
2/创建一个全局临时表并添加您的数字并将该表添加到您的查询中,指定一个连接。
3/ 使用 Ref Cursor 创建一些动态 PL/SQL。我在下面为您提供了一个示例,使用您的表 (emp) 和值。在这种情况下,您可以根据要查询的值构建字符串。见下文。varchar2 string: sqlString 可以根据需要进行操作。粘贴到测试工具中并查看。希望能帮助到你
declare
type refCursor is ref cursor;
tableCursor refCursor;
emp_record emp%rowtype;
sqlString varchar2(200);
begin
-- Dynamic SQL statement with placeholder:
sqlString := 'SELECT * FROM emp WHERE e_id in
(101, 102)';
-- Open cursor:
open tableCursor for sqlString;
-- Fetch rows from result set one at a time:
loop
fetch tableCursor
into emp;
exit when tableCursor%notfound;
dbms_output.put_line(emp.e_id);
end loop;
-- Close cursor:
close tableCursor;
end;
推荐阅读
- javascript - JavaScript 永久链接 URL
- java - android 9上相机“1”的Sinch VideoCaptureThread问题
- python-3.x - 我收到错误消息:ValueError: no enough values to unpack (expected 2, got 1)。可能是什么问题呢?
- sms - 如何在使用可变字母数字发件人 ID 时发送给多个收件人(没有循环)?
- node.js - 如何在 nodejs 中使用“npm mssql”检索多个记录集?
- r - 在for循环中循环以计算R中2个数据集之间的地理空间距离
- javascript - 为什么这个 javascript 函数不断返回一个未定义的数组?
- amazon-web-services - API Gateway 响应中的空正文
- azure - 使用 Azure API 管理和第三方授权服务器验证传入请求中的授权令牌
- tensorflow - Keras CIFAR-10 Dense Layer Code 为什么最后一层有 512 个神经元?