【发布时间】:2014-01-13 11:55:22
【问题描述】:
动态 SQL 不是我的朋友,基本上我的想法是我可以使用带有“p_in_table”参数的过程来获取表中包含的行数。
CREATE OR REPLACE PROCEDURE how_many_rows(p_in_table VARCHAR2)
IS
TYPE cur_cur IS REF CURSOR;
v_cur_cur cur_cur;
v_rowcount NUMBER(28);
v_cur_txt VARCHAR2(299);
BEGIN
v_cur_txt := 'SELECT * FROM ' || p_in_table;
OPEN v_cur_cur FOR v_cur_txt;
LOOP
v_rowcount := v_cur_cur%ROWCOUNT;
EXIT WHEN v_cur_cur%NOTFOUND;
END LOOP;
CLOSE v_cur_cur;
dbms_output.put_line(v_rowcount);
END;
如果有人能告诉我我做错了什么,我会感激吗?
【问题讨论】:
-
使用
select count(*),你的工作效率非常低。 -
“SELECT COUNT(*)”无疑是合理的解决方案,虽然我也想仔细研究一下 LOOP 问题,只是为了让自己变得更好。
-
这是从表中获取计数的最低效的方法。听从马特的建议。
-
根据它的馈送方式,您对 SQL 注入非常开放。阻止这种情况的最简单方法是通过检查 sysinfo 表(使用正常的准备好的语句)来验证
p_in_table是否包含表名,如果找不到则抛出相关的错误代码。您需要考虑表名何时被转义(大小写等)以及何时没有被转义的情况;忽略其他所有内容(也就是说,不要担心解决所有 Unicode 恶作剧 - 如果有技巧,您可能应该说“未找到” - 大多数表名将在 ASCII 内)。 -
谢谢,当我们开始讨论这篇文章时,我想知道,缺少的“FETCH INTO”确实解决了这个问题,同时使用与“p_in_table”相同的表,并且在v_row ??%ROWTPYE,但它会以某种方式使 v_row 声明也动态吗?