立即执行不返回预期结果以在整个表中搜索字符串
Posted
技术标签:
【中文标题】立即执行不返回预期结果以在整个表中搜索字符串【英文标题】:Execute immediate not returning expected result to search a string in entire table 【发布时间】:2021-07-27 08:29:11 【问题描述】:我正在尝试编写一个 PLSQL 块,如果它包含指定的查找文本,它将显示指定表的列名。
请在下面找到我的程序的代码:
执行后我没有得到任何结果。在示例 HR 模式中使用它。在下面的示例中,我试图找出包含 Steven 的列。
set serveroutput on;
exec col_name_string('EMPLOYEES','STEVEN')
;
我认为我的代码有一些问题,但仍然没有抛出任何运行时异常。
【问题讨论】:
因为您使用的是绑定变量,所以您正在执行以下查询 select count(1) from EMPLOYEES where UPPER( :col ) = UPPER(:search_value) 而不是 select count(1) from EMPLOYEES其中 UPPER( COLUMN_NAME ) = UPPER(:search_value) 如您所料。我的意思是,您正在比较 2 个变量而不是列与变量。您需要动态创建 SQL 文本,而不是使用 UPPER(:col),如图所示。没有错误,因为您正在执行一个好的查询,但不是所需的。真的很有趣。 【参考方案1】:这段代码有效;注意第 14 行 - 连接列名,不要绑定它。
(我更喜欢创建一个语句(在 l_str
中)以便我可以看到它(使用 dbms_output.put_line)并且 - 如果可以 - 执行它。
SQL> create or replace procedure col_name_string (tab_name in varchar2,
2 search_val in varchar2)
3 as
4 cnt number;
5 l_str varchar2 (200);
6 begin
7 for i in (select column_name
8 from user_tab_columns
9 where table_name = upper (tab_name))
10 loop
11 l_str :=
12 'select count(*) from '
13 || tab_name
14 || ' where upper(' || i.column_name || ') = upper(:search_val)';
15 execute immediate l_str into cnt using search_val;
16 if cnt > 0 then
17 dbms_output.put_line('Column : ' || i.column_name || ' contains the string');
18 end if;
19 end loop;
20 end;
21 /
Procedure created.
SQL> set serveroutput on
SQL> exec col_name_string('EMP', 'KING');
Column : ENAME contains the string
PL/SQL procedure successfully completed.
SQL>
(顺便说一句,你宁愿发布代码本身,而不是它的图像)。
【讨论】:
我没有声誉可以投票,但感谢您的回答。 @avkrish - 如果它解决了你的问题,你仍然可以accept this answer。以上是关于立即执行不返回预期结果以在整个表中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章