检查 table 重复项的过程 - Oracle PL/SQL
Procedure to check table for duplicates - Oracle PL/SQL
总的来说 SQL 很陌生。
看过一些关于如何在 PL/SQL 中将 table 声明为变量的示例,但是,其中 none 似乎满足了我的需要。
程序很简单,检查table中是否有重复的唯一编号,例如:
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;
/
如果你想在运行时改变 table,你需要动态 SQL 这意味着你需要 assemble SQL 声明你想要一个字符串变量并执行该字符串。如果您有过程,则需要该过程对查询结果进行处理。我的猜测是你想要 return 一个游标。
请注意,我没有做任何事情来验证 table 和列名以避免 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 很陌生。
看过一些关于如何在 PL/SQL 中将 table 声明为变量的示例,但是,其中 none 似乎满足了我的需要。
程序很简单,检查table中是否有重复的唯一编号,例如:
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;
/
如果你想在运行时改变 table,你需要动态 SQL 这意味着你需要 assemble SQL 声明你想要一个字符串变量并执行该字符串。如果您有过程,则需要该过程对查询结果进行处理。我的猜测是你想要 return 一个游标。
请注意,我没有做任何事情来验证 table 和列名以避免 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;