Sql Oracle查询(PROC)未给出所需结果
在oracle下面运行查询(存储过程内部)时 它给出以下输出 !![在此处输入图像描述][1] AI_TESTORACLE_TEMP_27977和AI_TESTORACLE_TEMP_27978的索引键当前显示功能索引的列名称,即dba_ind_列中的SYS_NC00023$和SYS_NC00024$,而我们期望的是“TestInt,lower(TestShortString)”和“TestSmallInt,UPPER(TestShortString)”..这是列表达式,可以从dba_col_expressions视图中派生Sql Oracle查询(PROC)未给出所需结果,sql,oracle,Sql,Oracle,在oracle下面运行查询(存储过程内部)时 它给出以下输出 !![在此处输入图像描述][1] AI_TESTORACLE_TEMP_27977和AI_TESTORACLE_TEMP_27978的索引键当前显示功能索引的列名称,即dba_ind_列中的SYS_NC00023$和SYS_NC00024$,而我们期望的是“TestInt,lower(TestShortString)”和“TestSmallInt,UPPER(TestShortString)”..这是列表达式,可以从dba_col_e
Name Null? Type
----------------------------------------------------------------------- -------- -----------------------------
INDEX_OWNER NOT NULL VARCHAR2(128)
INDEX_NAME NOT NULL VARCHAR2(128)
TABLE_OWNER NOT NULL VARCHAR2(128)
TABLE_NAME NOT NULL VARCHAR2(128)
COLUMN_EXPRESSION LONG
COLUMN_POSITION NOT NULL NUMBER
SQL> desc dba_ind_Columns;
Name Null? Type
----------------------------------------------------------------------- -------- ----------------------
INDEX_OWNER NOT NULL VARCHAR2(128)
INDEX_NAME NOT NULL VARCHAR2(128)
TABLE_OWNER NOT NULL VARCHAR2(128)
TABLE_NAME NOT NULL VARCHAR2(128)
COLUMN_NAME VARCHAR2(4000)
COLUMN_POSITION NOT NULL NUMBER
COLUMN_LENGTH NOT NULL NUMBER
CHAR_LENGTH NUMBER
DESCEND VARCHAR2(4)
COLLATED_COLUMN_ID NUMBER
只需在此查询中做一些小更改,即可将列表达式而不是列名输出为函数索引的索引键(这有点棘手)…其他列中不做任何更改..正在寻求所有专家的帮助
可以从DBA_索引中获取基于函数的NORMAL或NORMAL的索引_类型
SQL> select column_Expression from dba_ind_expressions where table_name='TESTORACLE_TEMP' AND TABLE_OWNER='ROLLOUT';
COLUMN_EXPRESSION
--------------------------------------------------------------------------------
LOWER("TESTSHORTSTRING")
UPPER("TESTSHORTSTRING")
SQL> select column_name from dba_ind_columns where table_owner='ROLLOUT' and table_name='TESTORACLE_TEMP';
COLUMN_NAME
----------------------------------------------------------------------------------------------------------------
KEYTESTORACLE
TESTTINYINT
TESTSMALLINT
TESTUNIQUEIDENTIFIER
TESTINT
SYS_NC00023$
TESTSMALLINT
SYS_NC00024$
UPDDATE
9 rows selected.
[![在此处输入图像描述][2][2]
添加索引键列(当前输出和预期)
[1]:
[2] :使用
用户索引表达式进行左连接
。如果此表不为空,则从该表中获取值,否则从user\u index\u列
中获取值。然后您可以进行分层查询,或者listag()
更好
一个问题Column\u expression
是长数据类型(至少我看到它是这种形式),所以我做了一个简单的函数将其转换为varchar(您可以改进它,请阅读适当的文章,例如在asktom站点上)
这是我的测试数据和查询:
create table emp(id primary key, fname, lname, dept) as (
select 707, 'Pete', 'Griffin', 'Sales' from dual);
create index idx_emp1 on emp(lower(dept));
create index idx_emp2 on emp(upper(lname), upper(fname));
select index_name,
ltrim(sys_connect_by_path(index_keys,','),',') as Index_Keys
from (
select t.*, row_number() over (partition by index_name order by column_position) as rn
from (
select index_name, column_name, column_position,
nvl(get_expr(table_name, index_name, column_position), column_name) as index_keys
from user_indexes di
join user_ind_columns ci using (table_name, index_name)
left join user_ind_expressions using (table_name, index_name, column_position)
where table_name = 'EMP') t )
where connect_by_isleaf = 1
connect by index_name = prior index_name and rn = prior rn+1
start with rn = 1
和查询:
create table emp(id primary key, fname, lname, dept) as (
select 707, 'Pete', 'Griffin', 'Sales' from dual);
create index idx_emp1 on emp(lower(dept));
create index idx_emp2 on emp(upper(lname), upper(fname));
select index_name,
ltrim(sys_connect_by_path(index_keys,','),',') as Index_Keys
from (
select t.*, row_number() over (partition by index_name order by column_position) as rn
from (
select index_name, column_name, column_position,
nvl(get_expr(table_name, index_name, column_position), column_name) as index_keys
from user_indexes di
join user_ind_columns ci using (table_name, index_name)
left join user_ind_expressions using (table_name, index_name, column_position)
where table_name = 'EMP') t )
where connect_by_isleaf = 1
connect by index_name = prior index_name and rn = prior rn+1
start with rn = 1
结果:
INDEX_NAME INDEX_KEYS
--------------- --------------------------------
IDX_EMP1 LOWER("DEPT")
IDX_EMP2 UPPER("LNAME"),UPPER("FNAME")
SYS_C00148175 ID
正如您所看到的,ID来自
用户索引列
,其他键来自用户索引表达式
您能提供一个相同的小提琴吗?谢谢..您能分享我转换的完整查询(先粘贴在表单中)吗?所以我可以测试一下…还有没有不使用函数(create)的方法…我们可以编写这个完整的查询?无论是sys\u connect\u by\u path
还是listagg
都不能使用long
数据类型,所以您必须以某种方式将这个值转换为varchar。功能是我唯一知道的。第二,我把重点放在有问题的部分,以使答案尽可能清楚。您的查询很长,您使用的是DBA视图,我不能。像上面那样进行连接,将owner
添加到连接条件中,还将owner
添加为函数参数。这是一个好地方,搜索者要求包含列_表达式,这意味着。@Pounderstibbons不适合我。。下面是根据您的建议更新的代码..它在命令行中给出错误:56列:86错误报告-SQL错误:ORA-00918:列定义模糊的00918。00000-“列定义不明确”使用(表名称、索引名称、列位置、表所有者)将此条件扩展到ri.table=di.table\u名称和ri.index\u名称上的。在其他位置的列名之前使用别名。