立即执行不返回预期结果以在整个表中搜索字符串

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。

以上是关于立即执行不返回预期结果以在整个表中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章

PDO 不返回任何结果,而 MySQL 命令行返回预期结果

执行立即更新返回 NULL 而非字符串查询工作正常

UISearch 栏总是显示:没有结果

立即执行结果到表类型

如果整个列数据与搜索字符串匹配,如何在jQUERY Datatable中显示/搜索数据?

如何从 Access 2010 中的 SQL 存储过程返回多个记录集