Determining Column name involve in Functional Index
I write this query to know about the existing indexes of all tables pertains to a schema. My problem is when index is functional one, column name is not descriptive, it is like SYS_NC00047$, ..... as yet i could not find the way to know exact column name in the out put of this query. your help is required..
SELECT index_owner,
index_name,
table_owner,
table_name,
column_name,
column_position,
column_length
FROM dba_ind_columns
WHERE index_owner = 'CORE_BUSINESS'
ORDER BY table_name ;
Use DBA_IND_EXPRESSIONS or USER_IND_EXPRESSIONS.
See this example :
SQL> drop table X_1 purge;
Table dropped.
SQL> create table X_1 (col_1 varchar2(5), col_2 number);
Table created.
SQL> create index X_1_UPPER_COL_1 on X_1(upper(col_1));
Index created.
SQL> set long 20000
SQL> select column_expression from user_ind_expressions
2 where index_name = 'X_1_UPPER_COL_1';
COLUMN_EXPRESSION
UPPER("COL_1")
SQL>Note : COLUMN_EXPRESSION is a LONG datatype and SET LONG defaults to 80 in SQLPlus, thus it will only show the first 80 characters of the expression unless you SET LONG to a higher value.
Hemant K Chitale
Similar Messages
-
Using Column Name returned by function in SELECT statement
Hi
Output from my function (RETURN data type is VARCHAR2) is column name. I want to use it directly in my SELECT statement. Below is simplified example of this:
--- Function
CREATE OR REPLACE FUNCTION simple RETURN varchar2 IS
BEGIN
RETURN ‘my_column’;
END simple;
--- Select
SELECT simple FROM my_table;
This does not work. It seems that output from function is passed in quotation i.e.
SELECT ‘my_column’ FROM my_table;
So the output from SELECT is a list of rows populated with values my_table:
COLUMN simple
ROW1 my_column
ROW2 my_column
ROW3 my_column
Can please someone help me with this?I'm not sure I got you right.
In standard SQL everything must be known at compile time. If not dynamic SQL is required, but is a costly operation (usually requires parsing before each execution) so it should better not be used when standard SQL can do it.
I provided a design time example where a function returns the column name from the given the table name and column id for a varchar2 column data type to make things simple. Then a query string is constructed and executed dynymically to return all column values of the chosen table_name.column_name.
SELECT simple FROM my_tableAt compile time the simple function return value is unknown (any varchar2 value would do) you already find out you get the (same) return value (i.e column name) for each table row => dynamic SQL needed to get the column values
The purpose of function would be to rename all columns for provided table.The table name would be provided, right? If yes => dynamic SQL
What is the function supposed to return the column name (where would the new name come from?), the column alias (which table column would be renamed to the new name?)
The user could use the new_column name as the column alias name submitting the query.
Is it possible to do this?Maybe () using a pipelined function (different data types - number,date, ... not cosidered yet) but your simple query;
<tt>SELECT simple FROM my_table</tt>
might look like:
<tt>select my_column_value new_column_name from table(get_column_value(table_name,column_name))</tt>
Sorry, no Database at hand to provide a specific example.
Regards
Etbin -
Need to return dynamic column names for a function returning nested table
I am having a pl/sql function which is returning a nested table.
For this i have defined an object which is having 4 attributes- 1 number type, 3 varchar2 type -p1,p2,p3.
My function is taking input parameter v1,v2,v3 all of varchar2 type.Inside the function body,i am using these (v1,v2,v3) to filter data from an sql query and i am also
using pivot function in this sql query.
At the end my function is returning the object as defined in the starting .
When i am excuting this function,thru select statement :
select * from table(f1_test('A','B','C'));
i am geting p1,p2,p3 as column name ,which are names used when i had defined object type.Instead i want column name to be dynamic (wotever i am passing in function as
parameter while executing the function ,here A,B,C)
Please help me in geting column names dynamic as passed in input parameter (i.e A,B,C for this case )
Sample code for the problem:
create or replace TYPE obj1 AS OBJECT
( id number(5,0)
,p1 varchar2(10),
,p2 varchar2(10)
,p3 varchar2(10)
create or replace TYPE tt1 AS TABLE OF OBJ1;
create or replace
function f1_test (v1 varchar2,v2 varchar2,v3 varchar2)
return tt1 as
v_return tt1 ;
v_str varchar2(30000);
begin
v_str:='
select
cast(
multiset(
select * from
select
aa.report_id
,cc.name
,e.amount
from
aa,cc,e
where
<join conditions>
and cc.name in ('''||v1||''','''||v2||''','''||v3||''')
pivot (sum (amount) for name in ('''||v1||''' as '||v1||','''||v2||''' as '||v2||','''||v3||''' as '||v3||'))
as tt1)
from
dual';
dbms_output.put_line(v_str);
execute immediate v_str
into
v_return ;
return v_return;
end;
Edited by: 845831 on 20 Mar, 2011 12:15 PMselect id,p1 A,p2 B,p3 C from table(f1_test('A','B','C'));
drop function f1_test;
drop type tt1;
drop type obj1;
create or replace TYPE obj1 AS OBJECT
( id number(5,0)
,p1 varchar2(10)
,p2 varchar2(10)
,p3 varchar2(10)
create or replace TYPE tt1 AS TABLE OF OBJ1;
CREATE OR REPLACE
FUNCTION f1_test(
v1 VARCHAR2,
v2 VARCHAR2,
v3 VARCHAR2)
RETURN tt1
AS
v_return tt1 ;
v_str VARCHAR2(30000);
BEGIN
v_str:='select cast(multiset(select 1,''20'',''30'',''40'' from dual) as tt1) from dual';
dbms_output.put_line(v_str);
EXECUTE immediate v_str INTO v_return ;
RETURN v_return;
END;
/ -
Determining column name at runtime
I have created a function that accepts a number of parameters, passes these values into a cursor which retrieves the appropriate values from the database and then I do my processing based on what the database returns. The specific problem here is that I need to look at each column in the table individually, but I don't want to hard-code the column name in my cursor. The cursor I tried to use for this purpose is below for your reference. It appears that I get the correct value returned from the query I aliased as B. If I run the statement below with the B.column_name hard-coded as q1000 (one of the actual column names), I get no rows returned which is the answer I'm looking for. However, it doesn't appear to be using the returned q1000 from query B and substituting that for B.column_name, so I get 1 row returned. I also looked at using Dynamic SQL and either I'm doing it wrong, or it isn't the correct solution to my problem. Any help would be appreciated. :)
CURSOR current_diary_cur IS
SELECT d.dmonth, d.dday
FROM p2_diary d, form_log f, (SELECT column_name
FROM all_tab_columns
WHERE table_name = 'P2_DIARY'
AND column_name = p_diary_field) B
WHERE d.form_seq = f.form_seq
AND f.subj_seq = p_subj_seq
AND f.visit_num = p_cur_vnum
AND d.dmonth = p_dmonth
AND d.dday = p_dday
AND B.column_name IS NOT NULL;One of my co-workers said something that made me realize a mistake I made in the post below. I am actually trying to do this in a Forms library and not Procedure Builder. We are using Forms version 6.0.8.11.3. Am I not able to use Dynamic SQL in this version of Forms?
Thanks for your reply. I tried to use the example you gave me and ran into compiler problems. So, I tried another example from Oracle8i Application Developer's Guide - Fundamentals Release 2 (8.1.6) documentation on Dynamic SQL - the function is listed below. When I tried to compile it, the compiler error I got was Encountered the symbol "STMT_STR" when expecting one of the following: select. This error occurs at the line where you open the cursor. This is the same message when I tried your code also. Am I doing something wrong, is my system not set up to handle this or is there some other problem I'm having? I'm trying to do this through Proc Builder and not at the command line...does this make a difference? Help!
FUNCTION my_func
return number
is
TYPE EmpCurTyp IS REF CURSOR;
cur EmpCurTyp;
stmt_str VARCHAR2(200);
name VARCHAR2(20);
salary NUMBER;
BEGIN
stmt_str := 'SELECT ename, sal FROM emp
WHERE job = :1';
OPEN cur FOR stmt_str USING 'SALESMAN';
LOOP
FETCH cur INTO name, salary;
EXIT WHEN cur%NOTFOUND;
-- <process data>
END LOOP;
CLOSE cur;
END; -
How to know the column name using the index name for a particular table
Hi All,
I have small query regarding, I have index name and table name so by using this how can I know the column name associated with that index of that particular table specific to Oracle9i.
Thanks
Sudheerselect *
from user_ind_columns -- or all_ind_columns
where table_name = UPPER('&table_name')
and index_name = UPPER('&index_name');
Regards
Arun
Gurgaon -
Using variable coulmn name in sql function
Hi there,
I am not an expert with PL/SQL and I can not figure out how to use variable column names in my function.
My function is:
CREATE OR REPLACE FUNCTION RESET_TRIGGERS(aTrigger VARCHAR2) RETURN NUMBER IS
TEMP_ID NUMBER;
TEMP_USER_ID NUMBER;
BEGIN
SELECT 'LIMS.'||'$aTrigger'||'.NEXTVAL' INTO TEMP_ID FROM DUAL;
SELECT 'LIMS.'||'$aTrigger'||'_USER.NEXTVAL' INTO TEMP_USER_ID FROM DUAL;
IF TEMP_ID > TEMP_USER_ID THEN
LOOP
SELECT LIMS.SQ_U_FINALRESULT_USER.NEXTVAL INTO TEMP_USER_ID FROM DUAL;
EXIT WHEN TEMP_USER_ID = TEMP_ID;
END LOOP;
ELSE
WHILE TEMP_ID < TEMP_USER_ID LOOP
SELECT LIMS.SQ_U_FINALRESULT.NEXTVAL INTO TEMP_ID FROM DUAL;
END LOOP;
END IF;
COMMIT;
RETURN (TEMP_ID);
END;
What I want is that I pass a seqencename with aTrigger and that two triggers will be equal if not.
eg ifaTrigger = 'SQ_U_FINALRESULT'
than I want the triggers LIMS.SQ_U_FINALRESULT and LIMS.SQ_U_FINALRESULT_USER to be set equal.
The above function will not work, but what will?????
I hope you can help me out!
CheersA very strange function indeed.
But here is what I think he meant to do:
SQL> create procedure reset_sequences
2 ( p_sequence_name in varchar2
3 , p_nextval out number
4 )
5 is
6 l_nextval1 number;
7 l_nextval2 number
8 ;
9 procedure reset_sequence_value
10 ( p_sequence_name in varchar2
11 , p_current_value in number
12 , p_new_value in number
13 )
14 is
15 l_dummy number;
16 begin
17 execute immediate 'alter sequence ' || p_sequence_name || ' increment by ' || to_char(p_new_value-p_current_value);
18 execute immediate 'select ' || p_sequence_name || '.nextval from dual' into l_dummy;
19 execute immediate 'alter sequence ' || p_sequence_name || ' increment by 1';
20 end reset_sequence_value
21 ;
22 begin
23 execute immediate
24 'select ' || p_sequence_name || '.nextval,' || p_sequence_name || '_user.nextval from dual'
25 into l_nextval1, l_nextval2
26 ;
27 if l_nextval1 < l_nextval2
28 then
29 reset_sequence_value(p_sequence_name,l_nextval1,l_nextval2);
30 end if
31 ;
32 if l_nextval1 > l_nextval2
33 then
34 reset_sequence_value(p_sequence_name || '_user',l_nextval2,l_nextval1);
35 end if
36 ;
37 p_nextval := greatest(l_nextval1,l_nextval2)
38 ;
39 end reset_sequences;
40 /
Procedure is aangemaakt.
SQL> show err
Er zijn geen fouten.
SQL> create sequence testseq start with 5 increment by 1
2 /
Reeks is aangemaakt.
SQL> create sequence testseq_user start with 2 increment by 1
2 /
Reeks is aangemaakt.
SQL> declare
2 l_new_value number;
3 begin
4 reset_sequences('testseq',l_new_value);
5 dbms_output.put_line(l_new_value);
6 end;
7 /
5
PL/SQL-procedure is geslaagd.
SQL> select testseq.currval from dual
2 /
CURRVAL
5
1 rij is geselecteerd.
SQL> select testseq_user.currval from dual
2 /
CURRVAL
5
1 rij is geselecteerd.Regards,
Rob. -
Finding name of *calling* function
Hi,
Is there any way to determine the name of the function that called a base class function?
Example:
class base {
protected void func(String msg) {
// who called me (derived f1 or f2)?
class derived extends base {
public void f1() {
func("some text");
public void f2() {
func("some text");
}I could do something like:
protected void func(String msg) {
// who called me (derived f1 or f2)?
try {
throw new Exception();
catch () {
// walk call stack...
}But this doesn't pass the smell test...
I want this check to be completely passive to the caller, so having the caller pass some value to the base func isn't an option. I want to take a slightly different action in the base func based upon who is calling me.
Thanks,
KenI want to take a slightly different action in the base func based upon
who is calling me.That smells big times; a super class is not supposed to know whether
or not it is extended and if so by what. Better go for a strategy approach
or even a simple command pattern.
If you really want to do it cheapo, define the base class as abstract and
mix in the 'slightly different' functionalities as abstract methods which
are implemented by the sub classes.
kind regards,
Jos -
Actual Column Name for Index when Function is used?
Hi,
We have some indeces where the column in oracle is actually a function in the form UPPER('column-name'). When I query user_ind_columns I get something like SYS_NC0012$ for the column name. Where would I be able to actually query the actual column it's using in the index? So that I can query the exact column name if need be. Don't ask why cause this is a developer asking me this and they are doing some sort of a comparison between indexes between two application.
Here is the SQL for the Index and the Table associated with it
create table BATCH_HEADER2
PAYMENT_TYPE VARCHAR2(17),
BATCH_TYPE VARCHAR2(40) not null,
BATCHNUM NUMBER not null,
BRANCH VARCHAR2(16),
BATCH_TIME NUMBER,
USER_LOB VARCHAR2(16),
PAYEE_TYPE VARCHAR2(40),
PROGRESS_RECID NUMBER,
CHEQUE_TYPE VARCHAR2(60),
SCANNERBATCHNO NUMBER,
RECEIPTCOUNT NUMBER
alter table BATCH_HEADER2
add constraint PK_BATCH_HEADER2 primary key (BATCH_TYPE, BATCHNUM)
using index
tablespace FT1_DATA;
--Inxes
create unique index FT1DSTINT.BATCH_HEADER2##BYNUM on FT1DSTINT.BATCH_HEADER2 (UPPER(BATCH_TYPE), BATCHNUM)
tablespace FT1_DATA
pctfree 10
initrans 2
maxtrans 255
storage (initial 64K
minextents 1
maxextents unlimited);From Oracle's standpoint, though, it isn't indexing BATCH_TYPE. It's indexing an arbitrary function that happens to take BATCH_TYPE as an input. As far as Oracle is concerned, you might just as easily be indexing an expression that took a dozen column names as parameters, so it doesn't really make sense for Oracle to try to break down anything beyond the function.
Of course, you could always parse the expression and extract the column name, but I would be dubious that's the right answer... If a developer is comparing indexes between columns, there is a heck of a lot of difference between an index on BATCH_TYPE, and index on UPPER(BATCH_TYPE) and an index on SOME_OTHER_FUNCTION( BATCH_TYPE ).
Justin -
How to know column name (not an expression) used by function-based index?
Hi guys,
Is there any way to know exact column name used by FBI? If I correct, there is SYS.ICOLDEP$ table that has mapping between index/table columns, but I don't see how it could be uniquely joined with the rest. I know about USER_IND_EXPRESSIONS, but the task is to know exact column name, not it's expression.
This required by our so-called SQL preprocessing of DB schema update utility, which parses stmt (INSERT in our case) and should check against PK/UNIQUE key values.
Thanks!I don't think this is possible in 10g or 11g because :
1. dictionary keeps track of column number in index and not in table
2. the expression used in CREATE INDEX is a system generated column
You would have to parse the expression from USER_IND_EXPRESSIONS:
SQL> create table t(x int, y int);
Table created.
SQL> create index fbi on t(y+1);
Index created.
SQL> column index_name format a10
SQL> column column_name format a20
SQL> column column_expression format a10
SQL> select i.index_name, ic.column_name, ic.column_position as iccn, ie.column_position as iecn, ie.column_expression
2 from user_indexes i , user_ind_columns ic, user_ind_expressions ie
3 where i.index_name = ic.index_name
4 and i.index_name = ie.index_name
5 and i.index_name = 'FBI';
INDEX_NAME COLUMN_NAME ICCN IECN COLUMN_EXP
FBI SYS_NC00003$ 1 1 "Y"+1 -
Do I need to create indexes on column name?
Following queries have been shown as bad sql :
select * from t1 where name = 'FUNCTION'
Count= 7 Avg Time=13 Min Time=0 Max Time=47
select * from t2 where name = 'USER_TYPE'
Count=2 Avg Time=85 Min Time=0 Max Time=156
select * from t3 where name = 'TEMPLATE'
Count=7 Avg Time=19 Min Time=0 Max Time=32
All these tables have less than 20 records and static tables.
Do I need to create indexes on column name?A FTS even on very small tables can require more latches than accessing via an index. Also, a table access requires the segment header and data block to be accessed (2) whereas an index on a small index only requires access to the index root block and table block (2).
True, it's unlikely to make much of a difference in most environments but if the table is really heavily accessed, indexing even very small tables can help to reduce the related latch overheads.
Most of these small tables have PKs and are accessed via the PK so associated indexes usually exist anyways.
Cheers
Richard Foote
http://richardfoote.wordpress.com/ -
Function short dump - A dynamically specified column name is unknown.
Hello,
I've created BRF fuction according to the Note 1466868 - Dunning by collection strategy with BRFplus. I get short dump during simulation of function with following exception:
"A dynamically specified column name is unknown. "
Runtime Errors SAPSQL_INVALID_FIELDNAME
Exception CX_SY_DYNAMIC_OSQL_SEMANTICS
No. Ty. Program Include Line
Name
19 METHOD CL_FDT_ELEMENT================CP CL_FDT_ELEMENT================CM012 129
CL_FDT_ELEMENT=>GET_VALUES_DDIC
18 METHOD CL_FDT_ELEMENT================CP CL_FDT_ELEMENT================CM011 124
CL_FDT_ELEMENT=>GET_VALUES
17 METHOD CL_FDT_WD_RENDER_VALUE_INPUT==CP CL_FDT_WD_RENDER_VALUE_INPUT==CM00G 139
CL_FDT_WD_RENDER_VALUE_INPUT=>VALIDATE_VALUES
In my opinion there is uncorrect query.
Current version:
. SELECT FIKRS AS VALUE NAME AS TEXT FROM FMBS_BS_T
INTO CORRESPONDING FIELDS OF TABLE lt_value
WHERE LANGU EQ 'E'.
instead of:
. SELECT FM_AREA AS VALUE NAME AS TEXT FROM FMBS_BS_T
INTO CORRESPONDING FIELDS OF TABLE lt_value
WHERE LANGU EQ 'E'.
My sap version:
EHP4 FOR SAP ERP 6.0 / NW7.01
SAP_BASIS 701 0003 SAPKB70103
Do you know any note or solution to resolve this problem.
Best regards,
Jacek WitczakHi, I came back to working on "Dunning by collection strategy with BRFplus". According to your sugestions, I raised the level of components:
SAP_BASIS Level 09
SAP_ABA level 09
PI_BASIS level 09
SAP_BW level 09
But still I have the same short dump.
Shoudl we raise any other components? Maybe you know note, which resolve this problem? -
CREATE INDEX WITH DUPLICATE COLUMN NAME
Hi,
i need to interface our application with an Orale Bridge to CREATE INDEX with duplcate column Name.
For Example
CREATE index NLOT_FOURNLOT_idx ON NLOT(FOURNISSEUR ,NOLOT ,FOURNISSEUR ,NOBLFOUNISSEUR,NOLIGNEBL ,NOLOT ,QTECOLISRECUES ,CODENONQUALITE ,QTECOLISACCEPTE);
CREATE table NLOT(
FOURNISSEUR VARCHAR2(09)
,NOBLFOURNISSEUR VARCHAR2(13)
,NOLIGNEBL VARCHAR2(03)
,NOLOT VARCHAR2(20)
,QTECOLISRECUES VARCHAR2(10)
,CODENONQUALITE VARCHAR2(02)
,QTECOLISACCEPTE VARCHAR2(10)
,NOMBREDECOLISRE VARCHAR2(10)
,NOMBREDECOLISAC VARCHAR2(10)
,FILLER VARCHAR2(1)
,FILLE1 VARCHAR2(1)
,TYPEREFERENCE VARCHAR2(01)
,REFERENC1 VARCHAR2(15)
,CONTROLERECEPTI VARCHAR2(01)
,DATEDEPEREMPTIO VARCHAR2(8)
,CONTROLEPROCHAI VARCHAR2(1)
Thanks
PhilippeWell, you can't do it. ORA-957 is one of those irrevocable errors for which the solution is to remove the duplicate name from the SQL statement.
But, anyway, why do you want to do this? I would guess there's no performance benefit from having the same column indexed twice (of course it's impossible to test this, so it's just my opinion).
Cheers, APC -
Maximum length allowed for column name, index name and table name?
Hi,
I want to know what is the maximum length allowed for coulmn name, table name and index name in MaxDB ?
Regards
RajHi Raja,
simply check the catalog:
sqlcli bwt=> \dc domain.columns
Table "DOMAIN.COLUMNS"
| Column Name | Type | Length | Nullable | KEYPOS |
| ---------------- | ------------ | ------ | -------- | ------ |
| SCHEMANAME | CHAR UNICODE | 32 | YES | |
| OWNER | CHAR UNICODE | 32 | YES | |
| TABLENAME | CHAR UNICODE | 32 | YES | |
| COLUMNNAME | CHAR UNICODE | 32 | YES | |
and
sqlcli bwt=> \dc domain.indexes
Table "DOMAIN.INDEXES"
| Column Name | Type | Length | Nullable | KEYPOS |
| ------------------ | ------------ | ------ | -------- | ------ |
| SCHEMANAME | CHAR UNICODE | 32 | YES | |
| OWNER | CHAR UNICODE | 32 | YES | |
| TABLENAME | CHAR UNICODE | 32 | YES | |
| INDEXNAME | CHAR UNICODE | 32 | YES | |
regards,
Lars -
How to pass column name at run time in function.
how to pass column name at run time in function as parameter.
thank in advance
pramod patelHello,
Using dynamic sql you can pass column name to function. well I am not getting what you really want to do ? Please write in more detail. By the way I am providing one example here. see it uses dynamic sql.
Create or replace function fun_updtest (p_columnname_varchar2 in varchar2,
p_value_number in number)
return number is
v_stmt varchar2(500);
begin
v_stmt := 'update emp
set '||p_columnname_varchar2||' = '||to_char(p_value_number)||'
where empno = 7369';
execute immediate v_stmt;
return 0;
commit;
end;
call to this function can be like this..
declare
v_number number;
begin
v_number := fun_updtest('SAL',5000);
end;
Adinath Kamode -
Passing parameters to table valued functions and using parameters as column name on select
I am creating a function where I want to pass it parameters and then use those parameters in a select statement. When I do that it selects the variable name as a literal not a column. How do I switch that context.
Query:
ALTER FUNCTION [dbo].[ufn_Banner_Orion_Employee_Comparison_parser_v2]
@BANNER_COLUMN AS VARCHAR(MAX),
@ORION_COLUMN AS VARCHAR(MAX)
RETURNS @Banner_Orion_Employee_Comparison TABLE
LAST_NAME nvarchar(max),
EMPNO int,
BannerColumnName nvarchar(max),
BANNER nvarchar(max),
ORION nvarchar(max)
AS
BEGIN
INSERT INTO @Banner_Orion_Employee_Comparison
(LAST_NAME, BANNER, ORION)
SELECT
a.LAST_NAME, @BANNER_COLUMN, @ORION_COLUMN
FROM OPENQUERY(ORCLPROD_APDORACLE, 'select LAST_NAME, BANNER_RANK, BADGE, EMP_STATUS from XTRACT_VIEW') AS a
inner join IWM_Stage.dbo.ViewPersonnel AS b
on a.BADGE = b.badge
WHERE a.EMP_STATUS = 'A'
and a.BANNER_RANK <> b.[rank]
RETURN;
END;
GO
Output
I execute this:
select * from ufn_Banner_Orion_Employee_Comparison_parser_v2 ('a.BANNER_RANK' , 'b.[rank]')
and get:
Cerecerez NULL
NULL a.BANNER_RANK
b.[rank]
George,
You could go for using a CASE statement as earlier mentioned by Erland. This would look like below: (Downside is that you need to be mentioning all possible values in the CASE)
ALTER FUNCTION [dbo].[ufn_Banner_Orion_Employee_Comparison_parser_v2]
@BANNER_COLUMN AS VARCHAR(MAX),
@ORION_COLUMN AS VARCHAR(MAX)
RETURNS @Banner_Orion_Employee_Comparison TABLE
LAST_NAME nvarchar(max),
EMPNO int,
BannerColumnName nvarchar(max),
BANNER nvarchar(max),
ORION nvarchar(max)
AS
BEGIN
INSERT INTO @Banner_Orion_Employee_Comparison(LAST_NAME, BANNER, ORION)
SELECT
a.LAST_NAME
, CASE @BANNER_COLUMN WHEN 'a.BANNER_RANK' THEN a.BANNER_RANK WHEN 'a.BADGE' THEN a.BADGE END --put values as required
, CASE @ORION_COLUMN WHEN 'b.[rank]' THEN b.[rank] END --put values as required
FROM OPENQUERY(ORCLPROD_APDORACLE, 'select LAST_NAME, BANNER_RANK, BADGE, EMP_STATUS from XTRACT_VIEW') AS a
inner join IWM_Stage.dbo.ViewPersonnel AS b
on a.BADGE = b.badge
WHERE a.EMP_STATUS = 'A'
and a.BANNER_RANK <> b.[rank]
RETURN;
END;
GO
Another method that I would suggest is to get all values from the function, then build a dynamic query to obtain results from it .. Something like:
ALTER FUNCTION [dbo].[ufn_Banner_Orion_Employee_Comparison_parser_v2]()
RETURNS @Banner_Orion_Employee_Comparison TABLE
LAST_NAME nvarchar(max),
EMPNO int,
BannerColumnName nvarchar(max),
BANNER nvarchar(max),
ORION nvarchar(max)
AS
BEGIN
INSERT INTO @Banner_Orion_Employee_Comparison(LAST_NAME, BANNER, ORION)
SELECT
* --Returns all the columns
FROM OPENQUERY(ORCLPROD_APDORACLE, 'select LAST_NAME, BANNER_RANK, BADGE, EMP_STATUS from XTRACT_VIEW') AS a
inner join IWM_Stage.dbo.ViewPersonnel AS b
on a.BADGE = b.badge
WHERE a.EMP_STATUS = 'A'
and a.BANNER_RANK <> b.[rank]
RETURN;
END;
GO
--Execution
DECLARE @BANNER_COLUMN AS VARCHAR(MAX), @ORION_COLUMN AS VARCHAR(MAX),@SQL NVARCHAR(MAX)
SET @BANNER_COLUMN='BANNER_RANK'
SET @ORION_COLUMN='[rank]'
SET @SQL='
select LAST_NAME,'+@BANNER_COLUMN+','+@ORION_COLUMN+' from ufn_Banner_Orion_Employee_Comparison_parser_v2 ()'
PRINT @SQL
EXEC @SQL
You just need to make sure that the column names returned by the function are UNIQUE (Using proper alias names) so that you don't have a problem referring to them from the outside..
Thanks,
Jay
<If the post was helpful mark as 'Helpful' and if the post answered your query, mark as 'Answered'>
Maybe you are looking for
-
I am confused at how to make a linked list using recursion. I've been looking at the syntax and examples from the web for the past couple hours, but all seem to be based on an empty .java file. I need to put it in my code somehow. here's the code seg
-
OSB ftp reading same file multiple times in cluster
We have 3 nodes osb cluster osb1,obs2, osb3 file based proxy is deployed to cluster with 'poll managed server' as osb1 and post read action as Archive We see same file is being read hundreds of times and archiving same hundreds of times Does anybody
-
Missing data after updating to 1.3.5.1
I updated my Palm Pre webOS to 1.3.5.1 and lost ALL my calendar events. My contacts no longer come up when I attempt to create a new text message. I also cannot view contacts or pull them up by typing the contact name when I want to make a call. A
-
Newly installed Photoshop Elements 12 doesn't open up on my computer.
I can't get past the task menu bar. how do I open up and use photoshop elements 12? I've clicked on Organizer to start organizing media and that didn't work. I clicked on Photo Editor to launch Photoshop Elements Editor and that didn't work.
-
Can anyone tell me if it is possible to create an array, and set the index to start at an element other than 0? I want to start my inedx at 2 with 11 elements rather than starting at 0 with elements 0 - 10. Please help! Thanks.