目标是创建一个Oracle函数,该函数能够从用户提供的令牌中查询列名,以创建具有此类功能的函数
select cols_like('%e%') from table
这是我目前的观点
CREATE OR REPLACE Function COLS_LIKE
(v_search in VARCHAR2, v_table in VARCHAR2)
RETURN VARCHAR
IS
TYPE r_cursor IS REF CURSOR;
c_emp r_cursor;
crs_cols VARCHAR(255);
column_list VARCHAR(1000);
BEGIN
OPEN c_emp FOR
'select COLUMN_NAME from cols
where TABLE_NAME = ''' || v_table || '''
and column_name like ''' || v_search || '''';
LOOP
FETCH c_emp INTO crs_cols;
EXIT WHEN c_emp%NOTFOUND;
if column_list IS NULL THEN
column_list := crs_cols;
else
column_list := column_list || ', ' || crs_cols;
end if;
END LOOP;
RETURN column_list;
END;
你调用这个函数的地方
Declare
tests VARCHAR(100);
sql_stmt VARCHAR2(200);
begin
tests := COLS_LIKE('%E%', 'table');
DBMS_OUTPUT.PUT_LINE(tests);
-- OR
sql_stmt := 'select ' || COLS_LIKE('%E%', 'table') || ' from table';
DBMS_OUTPUT.PUT_LINE(sql_stmt);
end;
最终目标将是这样的
select COLS_LIKE('%E%', 'table') from table;
我可以对我的功能进行哪些修改或如何调用以便正确应用此功能。
答案 0 :(得分:2)
为什么你想做这样的事情我不知道,但你可以很容易地将一个开放的光标返回到PL / SQL:
create or replace function cols_like (
PTable in varchar2
, PColumn in varchar2
) return sys_refcursor
l_cols varchar2(32767);
c_curs sys_refcursor;
begin
select listagg(column_name, ', ') within group (order by column_id)
into l_cols
from user_tab_cols
where table_name = upper(Ptable)
and column_name like '%' || upper(PColumn) || '%'
;
open c_curs for '
select ' || l_cols || '
from ' || Ptable;
return c_curs;
end;
/
将此问题返回到标准SQL语句将会非常困难,这是因为在选择此函数时,您只选择一个列的数据。您希望能够选择 N 列,这意味着您需要开始返回已动态创建的嵌套表。
我确信这是可能的;但是,在你接近开始试图做到这一点之前,想想为什么你正在做这件事。问一个问题,你没有说明你的最终目标,而是说明你的实际问题是什么。有可能有更简单的解决方案。
答案 1 :(得分:0)
我也有同样的问题,发现了这个,它对我有用。我只是对两张桌子上的手机号码进行比较,其中一张桌子的一些数字在开始时有0,有些则没有。终于得到了解决方案,并在开始时添加了%:
a.number was having numbers, in some of them starting 0 was missing. and b.number was accurate.
b.number like CONCAT('%',a.number)