检查表是不是重复的过程 - Oracle PL/SQL
Posted
技术标签:
【中文标题】检查表是不是重复的过程 - Oracle PL/SQL【英文标题】:Procedure to check table for duplicates - Oracle PL/SQL检查表是否重复的过程 - Oracle PL/SQL 【发布时间】:2021-04-01 06:51:40 【问题描述】:一般来说对 SQL 很陌生。
已经看过一些关于如何在 PL/SQL 中将表声明为变量的示例,但是,它们似乎都没有满足我的需求。
过程很简单,检查表中重复的唯一数字,例如:
select unique_id,
count(unique_id) as count_unique
from table_name
having count(unique_id)>1
group by unique_id
我想创建一个可以调用并动态更改the _name
和unique_id
的过程。
类似:
declare
table_name is table:= table_1
unique_id varchar2(100):= unique_1
begin
select unique_id,
count(unique_id) as count_unique
from table_name
having count(unique_id)>1
group by unique_id
end;
/
【问题讨论】:
【参考方案1】:如果您想在运行时更改表,则需要动态 SQL,这意味着您需要在字符串变量中组装所需的 SQL 语句并执行该字符串。如果您有一个过程,则需要该过程来处理查询结果。我的猜测是你想返回一个游标。
请注意,我没有做任何事情来验证表名和列名以避免 SQL 注入攻击。您可能希望使用 dbms_assert
来验证输入,而不是盲目地信任调用者。
create or replace procedure get_duplicates( p_table_name in varchar2,
p_column_name in varchar2,
p_rc out sys_refcursor )
as
l_sql varchar2(1000);
begin
l_sql := ' select ' || p_column_name || ', ' ||
' count(' || p_column_name || ') as unique_count ' ||
' from ' || p_table_name ||
' group by ' || p_column_name ||
' having count(' || p_column_name || ') > 1';
dbms_output.put_line( l_sql );
open p_rc for l_sql;
end;
【讨论】:
是的,我想,我需要一个动态 SQL 来运行这个检查,这样我就可以避免遇到特权墙。你能指出我吗? @I.Я.Newb - 抱歉,我不关注。动态 SQL 对权限没有任何影响。如果您具有查询表的权限,那么无论您使用的是动态 SQL 还是静态 SQL,您都具有权限。如果您没有权限,则无法查询该表。 抱歉,我可能说错了 - 我没有创建程序的权限。也许,一个新问题会更适合当前问题的动态 SQL 解决方案。 ***.com/questions/66902195/… - 我关于具有相同目的的动态 SQL 的问题。以上是关于检查表是不是重复的过程 - Oracle PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章