select *
from
(select * from ps_job where emplid = '123')
AS OF TIMESTAMP SYSDATE - 1;
As Of Date in Oracle SQL - Back to the Future
Posted by
Michael Nitschke
on Friday, 14 May 2010
Labels:
oracle sql flashback
/
Comments: (0)
This works:
Binary Search
Posted by
Michael Nitschke
Labels:
search peoplecode
/
Comments: (0)
Example of:
Function BinarySearch(&arr, &srchVal, &low As integer, &high As integer) Returns integer
If (&high < &low) Then
Return - 1; /* not found */
End-If;
&mid = &low + ((&high - &low) / 2);
If &arr [&mid] > &srchVal Then
Return BinarySearch(&arr, &srchVal, &low, &mid - 1);
Else
If &arr [&mid] < &srchVal Then
Return BinarySearch(&arr, &srchVal, &mid + 1, &high);
Else
Return ∣ /* found */
End-If;
End-If;
End-Function;
Posted by
Michael Nitschke
on Thursday, 6 May 2010
Labels:
sql default schedule
/
Comments: (0)
I don't often post random snippets of SQL, but I thought this was a good one. Rare enough to be able to forget it easily, and perhaps will be required again.
This returns schedules based on the schedule id(s) that is/are current for a given employee during a given payment period. If there is no schedule id default to 'UOA01'.
The first part was tricky as sch_assign is an effective dated table, and has no required end date, but each row does end when the next effective date comes into effect. I solved that using a subselect to derive the end_dt. Easy enough.
The next part, defaulting in 'UOA01' was a little trickier. A union to always bring in UOA01, but then a not exists subselect to only bring in where part A of the union returned nothing.
Perhaps easy when you see the solution first, this one took me quite a few attempts, and half the afternoon. Saved for prosperity and that time in the future when I ask myself "I remember doing similar...".
Apart from doing some tricky things with dates this SQL always returns a value. There is a default value in the SQL.
This returns schedules based on the schedule id(s) that is/are current for a given employee during a given payment period. If there is no schedule id default to 'UOA01'.
The first part was tricky as sch_assign is an effective dated table, and has no required end date, but each row does end when the next effective date comes into effect. I solved that using a subselect to derive the end_dt. Easy enough.
The next part, defaulting in 'UOA01' was a little trickier. A union to always bring in UOA01, but then a not exists subselect to only bring in where part A of the union returned nothing.
Perhaps easy when you see the solution first, this one took me quite a few attempts, and half the afternoon. Saved for prosperity and that time in the future when I ask myself "I remember doing similar...".
Apart from doing some tricky things with dates this SQL always returns a value. There is a default value in the SQL.
select
%DateOut(dur)
, b.sched_hrs
from
(select
a.schedule_id
, a.effdt as bgn_dt
,
(select min(x.effdt) - 1
from ps_sch_assign x
where x.emplid = a.emplid
and x.empl_rcd = a.empl_rcd
and x.effdt < a.effdt) as end_dt
from %Table(sch_assign) a
where a.emplid = %Bind(cc_a20_uoa_aet.emplid)
and a.empl_rcd = %Bind(cc_a20_uoa_aet.empl_rcd)
and a.schedule_id <> ' '
and a.effdt < %Bind(cc_a20_uoa_aet.prd_end_dt)
union
select
'UOA01'
, to_date('01/01/2000', 'dd/mm/yyyy') as bgn_dt
, to_date('31/12/9999', 'dd/mm/yyyy') as end_dt
from dual
where not exists
(select 1
from %Table(sch_assign) a
where a.emplid = %Bind(cc_a20_uoa_aet.emplid)
and a.empl_rcd = %Bind(cc_a20_uoa_aet.empl_rcd)
and a.schedule_id <> ' '
and a.effdt < %Bind(cc_a20_uoa_aet.prd_end_dt))) a
, %Table(sch_clnd_vw) b
where b.schedule_id = a.schedule_id
and b.dur between %Bind(cc_a20_uoa_aet.prd_bgn_dt) and %Bind(cc_a20_uoa_aet.prd_end_dt)
and (b.dur <= a.end_dt or a.end_dt is null)
and b.sched_hrs > 0
order by dur
HP Quality Center (QC)
In case I'm ever asked to export from QC again.
/*
Built for Jira 26921
Michael Nitschke 30/03/2010
Examples:
define testPlanRoot = 'SA Master'
define testLabRoot = 'System Testing\SYS1 SA'
define testPlanRoot = 'MTP Testing'
define testLabRoot = 'MTP Testing\MTP 13'
Hint: you can optionally add a trailing back-slash on the testLabRoot variable if you
need to clearly define it as seperate from and similarly named folder,
e.g. 'SYSTEM' and 'SYSTEM1'.
*/
/* notes:
Test Lab runs do not neccessarily line up in the same folders in Test Lab as the folders that are in Test Plan ...if that makes sense.
Joined by TEST_ID but the Test Lab folder Name can be changed, so the lab results for a given test plan may be in a test lab folder that has a different name to the plan.
hard to explain.
*/
define testPlanRoot = 'SA Master'
define testLabRoot = 'System Testing\System Test Phase 1 - SA\'
select * from (
SELECT
substr(path, 2, instr(path,'\',1,2) - 2) as lev1
, substr(path, instr(path,'\',1,2) + 1, instr(path,'\',1,3) - instr(path,'\',1,2) - 1) as lev2
, substr(path, instr(path,'\',1,3) + 1, instr(path,'\',1,4) - instr(path,'\',1,3) - 1) as lev3
, substr(path, instr(path,'\',1,4) + 1, instr(path,'\',1,5) - instr(path,'\',1,4) - 1) as lev4
, substr(path, instr(path,'\',1,5) + 1, instr(path,'\',1,6) - instr(path,'\',1,5) - 1) as lev5
, substr(path, instr(path,'\',1,6) + 1, instr(path,'\',1,7) - instr(path,'\',1,6) - 1) as lev6
, nvl(users.full_name, 'anon.') || ' (' || test.ts_responsible || ')' as sweet_fa
, test.ts_name as test_script_name
, test.ts_status
, run.rn_status
from (
select
al_father_id, al_item_id, sys_connect_by_path(al_description, '\') || '\' as path
FROM (SELECT * from all_lists where al_father_id <> 2329) -- 2329 is a 'bad', invisible folder. Yes really.
connect by prior al_item_id = al_father_id
) path
, test
, users
,
(select run.rn_test_id, run.rn_status
from run
where exists
(select 1
from cycle
where cycle.cy_cycle_id = run.rn_cycle_id
and cycle.cy_folder_id in
(select cf_item_id from
(select cf_item_id, sys_connect_by_path(cf_item_name, '\') as path
from cycl_fold a
connect by prior cf_item_id = cf_father_id)
where path like '\' || &testLabRoot || '%'))
and run.rn_execution_date =
(select max(r.rn_execution_date)
from run r
where r.rn_test_id = run.rn_test_id)
and run.rn_execution_time =
(select max(rn_execution_time)
from run r
where r.rn_test_id = run.rn_test_id
and r.rn_execution_date = run.rn_execution_date)) run
where path.path like '\' || &testPlanRoot || '%'
and test.ts_subject (+) = path.al_item_id
and users.user_name (+) = test.ts_responsible
and run.rn_test_id (+) = test.ts_test_id
)
where lev1 = &testPlanRoot -- Removes data where same folder name exists on another branch.
and not lev2 is null -- Don't need base folder only in data (blanks).
and not lev3 is null
order by 1, 2, 3, 4, 5, 6, 8
;
%DateIn or %DateOut
Posted by
Michael Nitschke
on Wednesday, 17 March 2010
/
Comments: (0)
Sometimes you need both:
%Select(CC_DAY_UOA_AET.DATE_DAY, CC_DAY_UOA_AET.SCHED_HRS)
SELECT
%DateOut(%DateIn(%Bind(CC_PYDT_UOA_AET.PYMT_DT)) + daynum)
, sched_hrs
FROM ps_sch_defn_dtl a
...
Extract Data from Quality Center (QC) 9.2 - SQL
Posted by
Michael Nitschke
on Friday, 19 February 2010
Labels:
SQL QC UAT
/
Comments: (0)
Quality Center is a testing suite used at a few installations. It comes with a collection of reports, including its own report generator.
Nonetheless it is nice to be able to get the RAW data and do with it what you will.
Note I've done some stripping of HTML tags using a combination of Replace() and a regular expression.
We dumped a larger set of the above results into a spreadsheet, connected to it through Access and wrote out all our UAT scripts as a report.
You can also join to the Test Lab to get the Test Results out. Note that it is joined by TEST_ID so the Lab folders may not line up with the Plan folders, you can change folder names etc.
Nonetheless it is nice to be able to get the RAW data and do with it what you will.
-- Extract ALL Test Plan Data:
SELECT
Replace(A.PATH, ' \\Subject\System Tests\SA System Test\', '') AS PATH
, B.TS_NAME
, C.DS_STEP_NAME
, REPLACE(REPLACE(REPLACE(REGEXP_REPLACE(REPLACE(C.DS_DESCRIPTION, '
', Chr(13)), '<(.|\n)+?>', ''), '<', '<'), '>', '>'), '"', Chr(34)) AS DS_DESCRIPTION
, REPLACE(REPLACE(REPLACE(REGEXP_REPLACE(REPLACE(C.DS_EXPECTED, '
', Chr(13)), '<(.|\n)+?>', ''), '<', '<'), '>', '>'), '"', Chr(34)) AS DS_EXPECTED
FROM
(SELECT AL_ITEM_ID, LPAD(' ', 2 * LEVEL-1) || SYS_CONNECT_BY_PATH(AL_DESCRIPTION, '\') AS PATH
FROM ALL_LISTS
CONNECT BY PRIOR AL_ITEM_ID = AL_FATHER_ID) A
, TEST B
, DESSTEPS C
WHERE A.PATH LIKE '%\\Subject\System Tests\SA System Test\GRADUATIONS%'
AND B.TS_SUBJECT = A.AL_ITEM_ID
AND C.DS_TEST_ID = B.TS_TEST_ID
ORDER BY A.PATH, B.TS_NAME, C.DS_STEP_ORDER
;
Note I've done some stripping of HTML tags using a combination of Replace() and a regular expression.
We dumped a larger set of the above results into a spreadsheet, connected to it through Access and wrote out all our UAT scripts as a report.
You can also join to the Test Lab to get the Test Results out. Note that it is joined by TEST_ID so the Lab folders may not line up with the Plan folders, you can change folder names etc.
/*
Built for Jira 26921
Michael Nitschke 30/03/2010
Examples:
define testPlanRoot = 'SA Master'
define testLabRoot = 'System Testing\SYS1 SA'
define testPlanRoot = 'MTP Testing'
define testLabRoot = 'MTP Testing\MTP 13'
Hint: you can optionally add a trailing back-slash on the testLabRoot variable if you
need to clearly define it as seperate from and similarly named folder,
e.g. 'SYSTEM' and 'SYSTEM1'.
*/
/* notes:
Test Lab runs do not neccessarily line up in the same folders in Test Lab as the folders that are in Test Plan ...if that makes sense.
Joined by TEST_ID but the Test Lab folder Name can be changed, so the lab results for a given test plan may be in a test lab folder that has a different name to the plan.
hard to explain.
*/
select * from (
SELECT
substr(path, 2, instr(path,'\',1,2) - 2) as lev1
, substr(path, instr(path,'\',1,2) + 1, instr(path,'\',1,3) - instr(path,'\',1,2) - 1) as lev2
, substr(path, instr(path,'\',1,3) + 1, instr(path,'\',1,4) - instr(path,'\',1,3) - 1) as lev3
, substr(path, instr(path,'\',1,4) + 1, instr(path,'\',1,5) - instr(path,'\',1,4) - 1) as lev4
, substr(path, instr(path,'\',1,5) + 1, instr(path,'\',1,6) - instr(path,'\',1,5) - 1) as lev5
, substr(path, instr(path,'\',1,6) + 1, instr(path,'\',1,7) - instr(path,'\',1,6) - 1) as lev6
, nvl(users.full_name, 'anon.') || ' (' || test.ts_responsible || ')' as sweet_fa
, test.ts_name as test_script_name
, test.ts_status
, run.rn_status
, test.ts_user_06 as Business_Owner
, test.ts_user_07 as Technical_Owner
, test.ts_user_04 as HR_Func_Area
, test.ts_user_05 as Tester
, test.ts_user_09 as Date_Time
, test.ts_user_08 as Location
, test.ts_user_02 as CBS_Test_Effort
, test.ts_user_01 as Summary
, test.ts_user_03 as CR_ID
from (
select
al_father_id, al_item_id, sys_connect_by_path(al_description, '\') || '\' as path
FROM (SELECT * from all_lists where al_father_id <> 2329) -- 2329 is a 'bad', invisible folder. Yes really.
connect by prior al_item_id = al_father_id
) path
, test
, users
,
(select run.rn_test_id, run.rn_status
from run
where exists
(select 1
from cycle
where cycle.cy_cycle_id = run.rn_cycle_id
and cycle.cy_folder_id in
(select cf_item_id from
(select cf_item_id, sys_connect_by_path(cf_item_name, '\') as path
from cycl_fold a
connect by prior cf_item_id = cf_father_id)
where path like '\' || &testLabRoot || '%'))
and run.rn_execution_date =
(select max(r.rn_execution_date)
from run r
where r.rn_test_id = run.rn_test_id)
and run.rn_execution_time =
(select max(rn_execution_time)
from run r
where r.rn_test_id = run.rn_test_id
and r.rn_execution_date = run.rn_execution_date)) run
where path.path like '\' || &testPlanRoot || '%'
and test.ts_subject (+) = path.al_item_id
and users.user_name (+) = test.ts_responsible
and run.rn_test_id (+) = test.ts_test_id
)
where lev1 = &testPlanRoot -- Removes data where same folder name exists on another branch.
and not lev2 is null -- Don't need base folder only in data (blanks).
and not lev3 is null
order by 1, 2, 3, 4, 5, 6, 8
;
SQL - Recursive Heirarchy Trees
Posted by
Michael Nitschke
on Thursday, 18 February 2010
Labels:
SQL Tree Heirarchy Recursive
/
Comments: (0)
Assuming a table something like this:
PERSON_IDStart with this.
PARENT_ID
NAME
SELECTGoogle "Connect By" for more information.
LPAD(' ', 2*level-1) || SYS_CONNECT_BY_PATH(NAME, '\') "Path"
FROM TABLE_NAME
CONNECT BY PRIOR PERSON_ID = PARENT_ID;