Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle查询(PROC)未给出所需结果_Sql_Oracle - Fatal编程技术网

Sql Oracle查询(PROC)未给出所需结果

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

在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视图中派生

 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名称上的
。在其他位置的列名之前使用别名。