Create View but get Warning: compiled but with compilation error in oracle - oracle
When i create a view I am getting this warning in Toad:
Warning: compiled but with compilation error in oracle
This is my script:
CREATE OR REPLACE FORCE VIEW APPS.KMI_OKP_TRACK_V
(
NO_OKP,
LINE,
FBD_PSD,
FBD_ASD,
FBD_PCD,
FBD_ACD,
FBD_DD,
FBD_BCD,
MIX_PSD,
MIX_ASD,
MIX_PCD,
MIX_ACD,
MIX_DD,
MIX_BCD,
BPR_PSD,
BPR_ASD,
BPR_PCD,
BPR_ACD,
BPR_DD,
BPR_BCD,
BLD_PSD,
BLD_ASD,
BLD_PCD,
BLD_ACD,
BLD_DD,
BLD_BCD,
CAN_PSD,
CAN_ASD,
CAN_PCD,
CAN_ACD,
CAN_DD,
CAN_BCD,
BAG_PSD,
BAG_ASD,
BAG_PCD,
BAG_ACD,
BAG_DD,
BAG_BCD,
DPG_PSD,
DPG_ASD,
DPG_PCD,
DPG_ACD,
DPG_DD,
DPG_BCD,
SAC_PSD,
SAC_ASD,
SAC_PCD,
SAC_ACD,
SAC_DD,
SAC_BCD,
BPE_PSD,
BPE_ASD,
BPE_PCD,
BPE_ACD,
BPE_DD,
BPE_BCD
)
AS
SELECT DISTINCT XX.NO_OKP,
XX.LINE --,XX.CREATION_DATE
,
FBD.FBD_PSD,
FBD.FBD_ASD,
FBD.FBD_PCD,
FBD.FBD_ACD,
FBD.FBD_DD,
FBD.FBD_BCD,
MIX.MIX_PSD,
MIX.MIX_ASD,
MIX.MIX_PCD,
MIX.MIX_ACD,
MIX.MIX_DD,
MIX.MIX_BCD,
BPR.BPR_PSD,
BPR.BPR_ASD,
BPR.BPR_PCD,
BPR.BPR_ACD,
BPR.BPR_DD,
BPR.BPR_BCD,
BLD.BLD_PSD,
BLD.BLD_ASD,
BLD.BLD_PCD,
BLD.BLD_ACD,
BLD.BLD_DD,
BLD.BLD_BCD,
CAN.CAN_PSD,
CAN.CAN_ASD,
CAN.CAN_PCD,
CAN.CAN_ACD,
CAN.CAN_DD,
CAN.CAN_BCD,
BAG.BAG_PSD,
BAG.BAG_ASD,
BAG.BAG_PCD,
BAG.BAG_ACD,
BAG.BAG_DD,
BAG.BAG_BCD,
DPG.DPG_PSD,
DPG.DPG_ASD,
DPG.DPG_PCD,
DPG.DPG_ACD,
DPG.DPG_DD,
DPG.DPG_BCD,
SAC.SAC_PSD,
SAC.SAC_ASD,
SAC.SAC_PCD,
SAC.SAC_ACD,
SAC.SAC_DD,
SAC.SAC_BCD,
BPE.BPE_PSD,
BPE.BPE_ASD,
BPE.BPE_PCD,
BPE.BPE_ACD,
BPE.BPE_DD,
BPE.BPE_BCD
FROM ( SELECT DISTINCT
RTRIM (
SUBSTR (BATCH_NO, 4, 4),
'A'
)
no_okp,
ATTRIBUTE1 LINE --,CREATION_DATE
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date,
'MM/DD/YYYY') IN
(TO_CHAR (
SYSDATE - 7,
'MM/DD/YYYY'
),
TO_CHAR (
SYSDATE - 8,
'MM/DD/YYYY'
))
ORDER BY CREATION_DATE DESC) XX
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (
SUBSTR (BATCH_NO, 4, 4),
'A'
)
no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE FBD_PSD,
ACTUAL_START_DATE FBD_ASD,
PLAN_CMPLT_DATE FBD_PCD,
ACTUAL_CMPLT_DATE FBD_ACD,
DUE_DATE FBD_DD,
BATCH_CLOSE_DATE FBD_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date,
'MM/DD/YYYY') IN
(TO_CHAR (
SYSDATE - 7,
'MM/DD/YYYY'
),
TO_CHAR (
SYSDATE - 8,
'MM/DD/YYYY'
))
AND attribute1 = 'FAT BLEND'
ORDER BY CREATION_DATE DESC) FBD
ON XX.NO_OKP = FBD.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4),
'A')
no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE MIX_PSD,
ACTUAL_START_DATE MIX_ASD,
PLAN_CMPLT_DATE MIX_PCD,
ACTUAL_CMPLT_DATE MIX_ACD,
DUE_DATE MIX_DD,
BATCH_CLOSE_DATE MIX_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date,
'MM/DD/YYYY') IN
(TO_CHAR (
SYSDATE - 7,
'MM/DD/YYYY'
),
TO_CHAR (
SYSDATE - 8,
'MM/DD/YYYY'
))
AND attribute1 = 'MIX'
ORDER BY CREATION_DATE DESC) MIX
ON XX.NO_OKP = MIX.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4),
'A')
no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE BPR_PSD,
ACTUAL_START_DATE BPR_ASD,
PLAN_CMPLT_DATE BPR_PCD,
ACTUAL_CMPLT_DATE BPR_ACD,
DUE_DATE BPR_DD,
BATCH_CLOSE_DATE BPR_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date,
'MM/DD/YYYY') IN
(TO_CHAR (SYSDATE - 7,
'MM/DD/YYYY'),
TO_CHAR (SYSDATE - 8,
'MM/DD/YYYY'))
AND attribute1 = 'BASE POWDER'
ORDER BY CREATION_DATE DESC) BPR
ON XX.NO_OKP = BPR.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4), 'A')
no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE BLD_PSD,
ACTUAL_START_DATE BLD_ASD,
PLAN_CMPLT_DATE BLD_PCD,
ACTUAL_CMPLT_DATE BLD_ACD,
DUE_DATE BLD_DD,
BATCH_CLOSE_DATE BLD_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date,
'MM/DD/YYYY') IN
(TO_CHAR (SYSDATE - 7,
'MM/DD/YYYY'),
TO_CHAR (SYSDATE - 8,
'MM/DD/YYYY'))
AND attribute1 = 'BLEND'
ORDER BY CREATION_DATE DESC) BLD
ON XX.NO_OKP = BLD.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4), 'A')
no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE CAN_PSD,
ACTUAL_START_DATE CAN_ASD,
PLAN_CMPLT_DATE CAN_PCD,
ACTUAL_CMPLT_DATE CAN_ACD,
DUE_DATE CAN_DD,
BATCH_CLOSE_DATE CAN_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date,
'MM/DD/YYYY') IN
(TO_CHAR (SYSDATE - 7,
'MM/DD/YYYY'),
TO_CHAR (SYSDATE - 8,
'MM/DD/YYYY'))
AND attribute1 = 'CANNING'
ORDER BY CREATION_DATE DESC) CAN
ON XX.NO_OKP = CAN.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4), 'A') no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE BAG_PSD,
ACTUAL_START_DATE BAG_ASD,
PLAN_CMPLT_DATE BAG_PCD,
ACTUAL_CMPLT_DATE BAG_ACD,
DUE_DATE BAG_DD,
BATCH_CLOSE_DATE BAG_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date, 'MM/DD/YYYY') IN
(TO_CHAR (SYSDATE - 7,
'MM/DD/YYYY'),
TO_CHAR (SYSDATE - 8,
'MM/DD/YYYY'))
AND attribute1 = 'BAG'
ORDER BY CREATION_DATE DESC) BAG
ON XX.NO_OKP = BAG.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4), 'A') no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE DPG_PSD,
ACTUAL_START_DATE DPG_ASD,
PLAN_CMPLT_DATE DPG_PCD,
ACTUAL_CMPLT_DATE DPG_ACD,
DUE_DATE DPG_DD,
BATCH_CLOSE_DATE DPG_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date, 'MM/DD/YYYY') IN
(TO_CHAR (SYSDATE - 7, 'MM/DD/YYYY'),
TO_CHAR (SYSDATE - 8, 'MM/DD/YYYY'))
AND attribute1 = 'DUMPING'
ORDER BY CREATION_DATE DESC) DPG
ON XX.NO_OKP = DPG.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4), 'A') no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE SAC_PSD,
ACTUAL_START_DATE SAC_ASD,
PLAN_CMPLT_DATE SAC_PCD,
ACTUAL_CMPLT_DATE SAC_ACD,
DUE_DATE SAC_DD,
BATCH_CLOSE_DATE SAC_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date, 'MM/DD/YYYY') IN
(TO_CHAR (SYSDATE - 7, 'MM/DD/YYYY'),
TO_CHAR (SYSDATE - 8, 'MM/DD/YYYY'))
AND attribute1 IN ('SACHET D', 'SACHET A')
ORDER BY CREATION_DATE DESC) SAC
ON XX.NO_OKP = SAC.NO_OKP
LEFT OUTER JOIN
( SELECT DISTINCT
RTRIM (SUBSTR (BATCH_NO, 4, 4), 'A') no_okp,
attribute1 Line,
DECODE (batch_status,
'1', 'Inspect',
'2', 'Release',
'3', 'Complete',
'Close')
Batch_status,
CREATION_DATE,
PLAN_START_DATE BPE_PSD,
ACTUAL_START_DATE BPE_ASD,
PLAN_CMPLT_DATE BPE_PCD,
ACTUAL_CMPLT_DATE BPE_ACD,
DUE_DATE BPE_DD,
BATCH_CLOSE_DATE BPE_BCD
FROM GME_BATCH_HEADER
WHERE ORGANIZATION_ID = 84
AND TO_CHAR (creation_date, 'MM/DD/YYYY') IN
(TO_CHAR (SYSDATE - 7, 'MM/DD/YYYY'),
TO_CHAR (SYSDATE - 8, 'MM/DD/YYYY'))
AND attribute1 = 'SACHET E'
ORDER BY CREATION_DATE DESC) BPE
ON XX.NO_OKP = BPE.NO_OKP
ORDER BY xx.no_okp ASC;
Where is the fault ?how to get the specific error code ?
To find the specific errors, either:
Test it without the force keyword.
Test it without the create view ... as part, i.e. test the select part on its own.
In SQL*Plus or compatible tools, execute the following command while connected as the APPS user: show errors view kmi_okp_track_v (or include the schema if executing from a DBA account)
Query user_errors while connected as the APPS user (or dba_errors if executing from a DBA account).
Example:
SQL> create or replace force view demo_view as
2 select nosuchcolumn from dual;
Warning: View created with compilation errors.
Test without the force keyword:
SQL> create or replace view demo_view as
2 select nosuchcolumn from dual;
select nosuchcolumn from dual
*
ERROR at line 2:
ORA-00904: "NOSUCHCOLUMN": invalid identifier
Testing the select statement on its own:
SQL> select nosuchcolumn from dual;
select nosuchcolumn from dual
*
ERROR at line 1:
ORA-00904: "NOSUCHCOLUMN": invalid identifier
Using show errors:
SQL> show errors view demo_view
Errors for VIEW DEMO_VIEW:
LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 ORA-00904: "NOSUCHCOLUMN": invalid identifier
Querying user_errors view:
SQL> col text format a70
SQL> select text from user_errors e
2 where e.name = 'DEMO_VIEW'
3 order by e.sequence;
TEXT
----------------------------------------------------------------------
ORA-00904: "NOSUCHCOLUMN": invalid identifier
For deployment scripts, I would include the force keyword and show errors at the end.
There's no problem with your syntax, and you may create this view in your current user, provided the schema prefix APPS. is removed from CREATE OR REPLACE FORCE VIEW APPS.KMI_OKP_TRACK_V.
If you need to create this view from your current schema, you need more prefixes for GME_BATCH_HEADER and the creation privilege should be granted for APPS schema.
As Barbaros said your query look good.
But here a problem i ran into - perhaps it's your problem, too.
-- This will work
CREATE OR REPLACE FORCE VIEW MySchema.MyView
(
MyColumn
)
AS
SELECT "MyColumn" FROM myTable;
-- This won't - because of the delimiter (';') in our variable myquery
DECLARE
myquery VARCHAR2(2000) :=
'CREATE OR REPLACE FORCE VIEW MySchema.MyView
(
MyColumn
)
AS
SELECT "MyColumn" FROM myTable;'
;
BEGIN
EXECUTE IMMEDIATE myquery;
END;
If you EXECUTE IMMEDIATE a query, it must not have a delimiter - neither ; nor /. This is not allowed because you always have to run a single statement, not a list of statement seperated by a delimiter.
The correct version is this:
-- This won't - because of the delimiter (';') in our variable myquery
DECLARE
myquery VARCHAR2(2000) :=
'CREATE OR REPLACE FORCE VIEW MySchema.MyView
(
MyColumn
)
AS
SELECT "MyColumn" FROM myTable' -- no ';' here
;
BEGIN
EXECUTE IMMEDIATE myquery;
END;
Fun-fact: Your View will be created and will work after a recompile.
Related
Need to pull by date, that a value appears from different tables
I have tried unions, joins, distinct and minimum functions with some success, but still slightly off. Example of the tables are below ID date 1 01-02-2020 2 02-02-2020 3 04-06-2020 4 01-03-2019 ID date 1 01-03-2018 2 07-02-2019 3 10-02-2020 4 09-02-2020 What I want is ID date 1 01-02-2020 2 01-03-2019 3 01-03-2018 4 07-02-2019 5 10-02-2020
It is not pretty But a Full OUT JOIN which MySQL doesn't have, of both tables did the trick CREATE TABLE tab1 ( `ID` INTEGER, `Value_ID` INTEGER, `date` VARCHAR(10) ); INSERT INTO tab1 (`ID`, `Value_ID`, `date`) VALUES ('1', '1', '01-02-2020'), ('2', '2', '02-02-2020'), ('3', '3', '04-06-2020'), ('4', '2', '01-03-2019'); CREATE TABLE tab2 ( `ID` INTEGER, `Value_ID` INTEGER, `date` VARCHAR(10) ); INSERT INTO tab2 (`ID`, `Value_ID`, `date`) VALUES ('1', '3', '01-03-2018'), ('2', '4', '07-02-2019'), ('3', '5', '10-02-2020'), ('4', '4', '09-02-2020'); SELECT COALESCE(t2.`Value_ID`,t1.`Value_ID`) as `Value_ID`,IF (IFNULL(t1.`date`,'31-12-9999') <= t2.`date`,t1.`date`,t2.`date`) FROM (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab1 GROUP BY `Value_ID`) t1 right JOIN (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab2 GROUP BY `Value_ID`) t2 ON t1.`Value_ID` = t2.`Value_ID` UNION SELECT COALESCE(t1.`Value_ID`,t2.`Value_ID`),IF (t1.`date` <= IFNULL(t2.`date`,'31-12-9999'),t1.`date`,t2.`date`) FROM (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab1 GROUP BY `Value_ID`) t1 LEFT JOIN (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab2 GROUP BY `Value_ID`) t2 ON t1.`Value_ID` = t2.`Value_ID` ORDER BY `Value_ID` Value_ID | IF (IFNULL(t1.`date`,'31-12-9999') <= t2.`date`,t1.`date`,t2.`date`) -------: | :------------------------------------------------------------------- 1 | 01-02-2020 2 | 01-03-2019 3 | 01-03-2018 4 | 07-02-2019 5 | 10-02-2020 db<>fiddle here You can use Window functions Schema (MySQL v8.0) CREATE TABLE tab1 ( `ID` INTEGER, `Value_ID` INTEGER, `date` VARCHAR(10) ); INSERT INTO tab1 (`ID`, `Value_ID`, `date`) VALUES ('1', '1', '01-02-2020'), ('2', '2', '02-02-2020'), ('3', '3', '04-06-2020'), ('4', '2', '01-03-2019'); CREATE TABLE tab2 ( `ID` INTEGER, `Value_ID` INTEGER, `date` VARCHAR(10) ); INSERT INTO tab2 (`ID`, `Value_ID`, `date`) VALUES ('1', '3', '01-03-2018'), ('2', '4', '07-02-2019'), ('3', '5', '10-02-2020'), ('4', '4', '09-02-2020'); Query #1 SELECT `Value_ID`, `date` FROM (SELECT `Value_ID`, `date` , ROW_NUMBER() OVER (PARTITION BY `Value_ID` ORDER BY `date` ASC) rn FROM (SELECT `Value_ID`, MIN(`date`) as `date` FROM tab1 GROUP BY `Value_ID` UNION SELECT `Value_ID`, MIN(`date`) as `date` FROM tab2 GROUP BY `Value_ID`) t1 ) t3 WHERE rn = 1; Value_ID date 1 01-02-2020 2 01-03-2019 3 01-03-2018 4 07-02-2019 5 10-02-2020 View on DB Fiddle
Oracle - Return a column per date in a range
Let's say I have Table A: assistance PersonID Date CHECK 123456 2012-01-01 F 213415 2012-01-03 A PersonID ArrivalDate Jan-01 Jan-02 Jan-03 123456 2012-01-01 F NULL NULL 213415 2012-01-03 NULL NULL A The system is for checks, between 1 to 15 days but no more than that. Any ideas would be very much appreciated.
you can try this, but I'm not sure if this is what you need, with inputs_ as (select 123456 person_id, to_date('2012-01-01', 'YYYY-MM-DD') date_, 'F' check_ from dual union all select 213415 person_id, to_date('2012-01-03', 'YYYY-MM-DD'), 'A' check_ from dual UNION ALL select 123456 person_id, to_date('2012-01-01', 'YYYY-MM-DD') date_, 'F' check_ from dual union all select 213415 person_id, to_date('2012-01-03', 'YYYY-MM-DD'), 'A' check_ from dual union all select 123456 person_id, to_date('2012-01-04', 'YYYY-MM-DD') date_, 'F' check_ from dual union all select 213415 person_id, to_date('2012-01-05', 'YYYY-MM-DD'), 'A' check_ from dual union all select 123456 person_id, to_date('2012-01-02', 'YYYY-MM-DD') date_, 'A' check_ from dual union all select 213415 person_id, to_date('2012-01-04', 'YYYY-MM-DD'), 'A' check_ from dual UNION ALL select 213415 person_id, to_date('2012-01-02', 'YYYY-MM-DD'), 'F' check_ from dual) select * from (select person_id, date_ arrival_date, check_, TO_CHAR(date_, 'DD-MON') date_ from inputs_) pivot (min(check_) for date_ in ('01-JAN', '02-JAN', '03-JAN', '04-JAN', '05-JAN') ) order by 2; Output: Also this is not dynamic, so if you want dynamic pivot, you can see this link, Dynamic pivot in oracle sql
You could construct dynamic date values for PIVOT's IN clause for the range min date to max date using a query. Then open a dynamic cursor with the required arguments in the IN clause of PIVOT. DBMS_SQL.RETURN_RESULT ( 12c and later ) will display the desired result. For older versions, you may refer my answer here to easily display the cursor's output: Display result DECLARE v_instring VARCHAR2 (1000); v_cur SYS_REFCURSOR; BEGIN WITH dt ( min_t ,max_t ) AS ( SELECT MIN(Date_t) ,MAX(Date_t) FROM TableA ) , datevalues (date_ch) AS (SELECT TO_CHAR(min_t + lvl - 1, 'DD-MON') FROM dt CROSS APPLY ( SELECT LEVEL lvl FROM DUAL CONNECT BY LEVEL <= max_t - min_t + 1 ) ) SELECT LISTAGG('''' || date_ch || ''' AS "' || date_ch, '",') WITHIN GROUP ( ORDER BY date_ch )||'"' INTO v_instring FROM ( SELECT DISTINCT date_ch FROM datevalues ); OPEN v_cur FOR 'select * from (select PersonID, date_t arrival_date, check_t, TO_CHAR(date_t, ''DD-MON'') date_t from TableA) pivot ( min(check_t) for date_t in ('||v_instring||')) ORDER BY arrival_date'; DBMS_SQL.RETURN_RESULT(v_cur); END; / PERSONID ARRIVAL_DATE 01-JAN 02-JAN 03-JAN 04-JAN 05-JAN 06-JAN ------------- --------------- ------ ------ ------ ------ ------ ------ 123456 01-01-12 F 213415 03-01-12 A 213416 04-01-12 F 345677 06-01-12 A
ORA-32033: unsupported column aliasing
I have a query that is working on oracle 12c but not in 10g. I am not sure what the problem is: My query is: WITH tab1(rn,begin_chq_num,chq_lvs_stat,chq_num_of_lvs,tes) AS (SELECT 1 rn, begin_chq_num, chq_lvs_stat, chq_num_of_lvs, SUBSTR(chq_lvs_stat,1,1) tes FROM tbaadm.chq_book_table WHERE del_flg != 'Y' AND acid IN (SELECT acid FROM tbaadm.GENERAL_ACCT_MAST_TABLE WHERE foracid = '01411110171546' ) UNION ALL SELECT rn + 1 rn, begin_chq_num, chq_lvs_stat, chq_num_of_lvs, SUBSTR(chq_lvs_stat,rn + 1,1) tes FROM tab1 WHERE rn < chq_num_of_lvs ) SELECT CASE WHEN begin_chq_num = 1 THEN rn ELSE begin_chq_num +(rn-1) END cheque_num, begin_chq_num ||'-' ||(chq_num_of_lvs+begin_chq_num-1) cheque_range, DECODE(tes, 'I', 'Issued', 'P', 'Cleared', 'U', 'Unused', 'S', 'Stopped', 'C', 'Cautioned', 'D', 'Destroyed', 'R', 'Returned Paid', 'T', 'Transfered') status FROM tab1 ORDER BY chq_lvs_stat, rn; The error is : ORA-32033: unsupported column aliasing 32033. 00000 - "unsupported column aliasing" *Cause: column aliasing in WITH clause is not supported yet *Action: specify aliasing in defintion subquery and retry What should I do different?
In Oracle 10g, the sub-query factoring clause does not support column aliases or recursive sub-queries. The syntax you are using appears in 11gR2. You need to change: WITH tab1(rn,begin_chq_num,chq_lvs_stat,chq_num_of_lvs,tes) AS To: WITH tab1 AS And find a different solution that does not use a recursive subquery factoring clause. I think you could do this in Oracle 10g: WITH tab1 AS ( SELECT l.COLUMN_VALUE rn, begin_chq_num, chq_lvs_stat, chq_num_of_lvs, SUBSTR(chq_lvs_stat,l.COLUMN_VALUE,1) tes FROM tbaadm.chq_book_table t, TABLE( CAST( MULTISET( SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= LENGTH( t.chq_lvs_stat ) ) AS SYS.ODCINUMBERLIST ) ) l WHERE del_flg != 'Y' AND acid IN ( SELECT acid FROM tbaadm.GENERAL_ACCT_MAST_TABLE WHERE foracid = '01411110171546' ) ) SELECT CASE WHEN begin_chq_num = 1 THEN rn ELSE begin_chq_num +(rn-1) END cheque_num, begin_chq_num ||'-' ||(chq_num_of_lvs+begin_chq_num-1) cheque_range, DECODE( tes, 'I', 'Issued', 'P', 'Cleared', 'U', 'Unused', 'S', 'Stopped', 'C', 'Cautioned', 'D', 'Destroyed', 'R', 'Returned Paid', 'T', 'Transfered' ) status FROM tab1 ORDER BY chq_lvs_stat, rn;
count from current row to last row
I have a requirement to pull the data in the below fashion. progress_CMC_status progress_cmc_status_numbers cmc_status_numbers Mature Draft 2 5 Review 0 3 Final Draft 0 3 Final Comment 0 3 Final Document 2 3 Archived Document 1 1 but i am getting output in different progress_CMC_status progress_cmc_status_numbers cmc_status_numbers Mature Draft 2 5 Review 0 0 Final Draft 0 0 Final Comment 0 0 Final Document 2 3 Archived Document 1 1 Tried the below code: WITH sta AS (SELECT 'Mature' "status1" FROM DUAL UNION SELECT 'Review' FROM DUAL UNION SELECT 'Final Draft' FROM DUAL UNION SELECT 'Final Comment' FROM DUAL UNION SELECT 'Final Document' FROM DUAL UNION SELECT 'Archived' FROM DUAL) SELECT DECODE ("stat", 'Mature', 'Mature Draft', 'Review', 'Review', 'Final Draft', 'Final Draft', 'Final Comment', 'Final Comment', 'Final Document', 'Final Document', 'Archived', 'Archived Document' ) AS "progress_CMC_status", NVL (TO_CHAR ("progress_cmc_status_numbers"), 0 ) AS "progress_cmc_status_numbers", NVL (TO_CHAR ("cmc_status_numbers"), 0) AS "cmc_status_numbers" FROM (SELECT "status1" AS "stat", NVL (TO_CHAR (NULL), "progress_cmc_status_numbers" ) AS "progress_cmc_status_numbers", NVL (TO_CHAR (NULL), "cmc_status_numbers" ) AS "cmc_status_numbers" FROM sta LEFT JOIN (SELECT VALUE AS "progress_CMC_status", COUNT (*) AS "progress_cmc_status_numbers", SUM (COUNT (*)) OVER (ORDER BY DECODE (VALUE, 'Mature', 0, 'Review', 1, 'Final Draft', 2, 'Final Comment', 3, 'Final Document', 4, 'Archived', 5, 6 ) DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "cmc_status_numbers" FROM ATTRIBUTES WHERE attribute_type_id IN ( SELECT attribute_type_id FROM attribute_types WHERE name_display_code = 'RD') AND VALUE IN ('Mature', 'Review', 'Final Draft', 'Final Comment', 'Final Document', 'Archived') AND object_id IN (SELECT obj_id FROM docs) GROUP BY VALUE) a1 ON sta."status1" = a1."progress_CMC_status" ) ORDER BY DECODE ("progress_CMC_status", 'Mature Draft', 0, 'Review', 1, 'Final Draft', 2, 'Final Comment', 3, 'Final Document', 4, 'Archived Document', 5, 6 ) sample data CREATE TABLE ATTRIBUTES ( object_id NUMBER(4), attribute_type_id NUMBER(4), name_display_code VARCHAR2(5), VALUE VARCHAR2(25) ); begin insert into attributes values (101,201,'RMD','A100'); insert into attributes values (102,201,'RMD','A200'); insert into attributes values (103,201,'RMD','A300'); insert into attributes values (104,200,'RD','Mature'); insert into attributes values (105,200,'RD','Mature'); insert into attributes values (106,200,'RD','Mature'); insert into attributes values (107,200,'RD','Mature'); insert into attributes values (108,200,'RD','Mature'); insert into attributes values (109,200,'RD','Archived'); insert into attributes values (110,200,'RD','Archived'); insert into attributes values (111,200,'RD','Archived'); insert into attributes values (112,200,'RD','Archived'); insert into attributes values (113,200,'RD','Mature'); insert into attributes values (114,200,'RD','Mature'); insert into attributes values (115,200,'RD','Mature'); insert into attributes values (116,200,'RD','Mature'); insert into attributes values (117,200,'RD','Final Document'); insert into attributes values (118,200,'RD','Final Document'); insert into attributes values (119,201,'RMD','A400'); insert into attributes values (120,201,'RMD','A500'); end; / CREATE TABLE docs ( obj_id NUMBER(4) ); BEGIN INSERT INTO docs VALUES (100); INSERT INTO docs VALUES (104); INSERT INTO docs VALUES (109); INSERT INTO docs VALUES (117); INSERT INTO docs VALUES (118); INSERT INTO docs VALUES (119); INSERT INTO docs VALUES (120); END; / CREATE TABLE attribute_types ( attribute_type_id NUMBER(4), name_display_code VARCHAR2(5) ); INSERT INTO attribute_types VALUES (200, 'RD'); INSERT INTO attribute_types VALUES (201, 'RMD');
WITH sta AS (SELECT 'Mature' "status1" FROM DUAL UNION SELECT 'Review' FROM DUAL UNION SELECT 'Final Draft' FROM DUAL UNION SELECT 'Final Comment' FROM DUAL UNION SELECT 'Final Document' FROM DUAL UNION SELECT 'Archived' FROM DUAL) SELECT DECODE ("stat", 'Mature', 'Mature Draft', 'Review', 'Review', 'Final Draft', 'Final Draft', 'Final Comment', 'Final Comment', 'Final Document', 'Final Document', 'Archived', 'Archived Document' ) AS "progress_CMC_status", NVL("progress_cmc_status_numbers", 0) AS "progress_cmc_status_numbers", SUM (NVL("progress_cmc_status_numbers", 0)) OVER (ORDER BY -DECODE ("stat", 'Mature', 0, 'Review', 1, 'Final Draft', 2, 'Final Comment', 3, 'Final Document', 4, 'Archived', 5, 6) ) AS "cmc_status_numbers" FROM ( SELECT "status1" AS "stat", "progress_cmc_status_numbers" FROM sta LEFT JOIN ( SELECT VALUE AS "progress_CMC_status", COUNT (*) AS "progress_cmc_status_numbers" FROM ATTRIBUTES WHERE attribute_type_id IN ( SELECT attribute_type_id FROM attribute_types WHERE name_display_code = 'RD' ) AND VALUE IN ('Mature', 'Review', 'Final Draft', 'Final Comment', 'Final Document', 'Archived') AND object_id IN (SELECT obj_id FROM docs) GROUP BY VALUE ) a1 ON sta."status1" = a1."progress_CMC_status" ) ORDER BY DECODE ("progress_CMC_status", 'Mature Draft', 0, 'Review', 1, 'Final Draft', 2, 'Final Comment', 3, 'Final Document', 4, 'Archived Document', 5, 6) fiddle
Oracle pivot query results in a "command not properly ended" error
When firing the following query to a 10g Oracle database: SELECT * FROM ( SELECT T1.ID, T2.ACCT_NO, ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T1.ID DESC) AS RRRRRRR FROM TABLE1 T1 INNER JOIN TABLE T2 ON T1.ID = T2.ID WHERE T1.ID = 666 ) PIVOT (MIN(T1.ID) AS ALIAS1 FOR RRRRRRR IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); I get an "command not properly ended" error. I've searched for Oracle pivot examples and they all pretty much showed the same example. What am I missing here?
As #APC pointed out there is no PIVOT function in oracle 10g, so you can use an aggregate function and a CASE, similar to this: SELECT id, acct_no, min(case when RRRRRRR = 1 then id end) as '1', min(case when RRRRRRR = 2 then id end) as '2', min(case when RRRRRRR = 3 then id end) as '3', min(case when RRRRRRR = 4 then id end) as '4', min(case when RRRRRRR = 5 then id end) as '5', min(case when RRRRRRR = 6 then id end) as '6', min(case when RRRRRRR = 7 then id end) as '7', min(case when RRRRRRR = 8 then id end) as '8', min(case when RRRRRRR = 9 then id end) as '9', min(case when RRRRRRR = 10 then id end) as '10' FROM ( SELECT T1.ID, T2.ACCT_NO, ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T1.ID DESC) AS RRRRRRR FROM TABLE1 T1 INNER JOIN TABLE T2 ON T1.ID = T2.ID WHERE T1.ID = 666 ) x GROUP BY id, acct_no
Your syntax is impeccable. Unfortunately PIVOT was introduced in Oracle 11g and you're using 10g.