Using Pipelined Functions
Hi,
Can any one please provide me a good example to try out pipelined function in oracle pl/sql ?
Thanks
I'm curious. In your biography you state "I am a software programmer working in IT field from last 7-8 years. I am a OCP in Application Development Track"
So how come that you are not familiar with Oracle Documentation and it's full text search capability, which would have given you a reference, such as this?
C.
Similar Messages
-
Use PipeLine function as datasource
Hi all.
Does anybody use PipeLine function as datasource for Bi EE ? Do you have any experience ?For more discuss :
I was read article from Venkatakrishnan
http://oraclebizint.wordpress.com/2007/09/21/oracle-bi-ee-101323-ref-cursors-and-pipelined-functions/
and in that case all lok's fine and work. But in my case I was neded disable aggregate and order by functionality , becouse have some Issues. can anybody comment this situation :What's wrong in using PipeLine and BIee ? -
Trouble using pipelined function in an select list lov query
I'm trying to use a pipelined function in a select list lov query but i cet the error
"LOV query is invalid, a display and a return value are needed, the column names need to be different. If your query contains an in-line query, the first FROM clause in the SQL statement must not belong to the in-line query."
my query is as follows :
SELECT gt.navn d, gt.GEOGRAPHY_TYPE_ID r
FROM GEOGRAPHY_TYPE gt
WHERE gt.kode NOT IN (1)
and gt.kode in (select lov_value from table(RAPPORT_FILTER_PKG.GET_RAPPORT_FILTER_VALUE_PIP (
SYS_CONTEXT ('rapport_filter_ctx','filter_id'),'GEOGRAPHY_TYPES')) )
ORDER BY gt.navn DESC
if i use a discrete values '80' instead of the call to
SYS_CONTEXT ('rapport_filter_ctx','filter_id')
i don't get eny errors, but then the LOV isn't as dynamic as i has to be
any idears???
Edited by: [email protected] on Dec 1, 2008 8:50 AM
Edited by: [email protected] on Dec 1, 2008 11:17 AMnope that doesn't do it either
contains a syntax errror at
SYS_CONTEXT (('rapport_filter_ctx',:P500_RAPPORT_FILTER_ID),'GEOGRAPHY_TYPES'))
my theory is that it's got something to do with the way APEX binds values because
the query
SELECT gt.navn d, gt.GEOGRAPHY_TYPE_ID r
FROM GEOGRAPHY_TYPE gt
WHERE gt.kode NOT IN (1)
and gt.kode in (select r from table(RAPPORT_FILTER_PKG.GET_RAPPORT_FILTER_VALUE_PIP ('80','GEOGRAPHY_TYPES')) )
ORDER BY gt.navn DESC
works fine in both TOAD and in APEX but as soon as i replace th '80' with :P500_RAPPORT_FILTER_ID then, apex won't accept the code??????
Edited by: [email protected] on Dec 3, 2008 7:54 AM -
Using pipelined functions with bind variables in Apex...
Hy all:
I have a table which has about 10 million records and it is hanging up the system when it is trying to retrieve the data from that table... so what I have done is I created a pripelined
function and then trying to retrieve data using an SQL statement ... when I try to use a bind variable to filter by the date and location it is binding according to the location
but not by date ... can anyone help me in this please!!
Help greatly appreciated !
Thanks in advance !Hi Denes:
Create or replace type ohe1 as object (
IMLITM NCHAR(50), IMAITM NCHAR(50), IMDSC1 NCHAR(60), COUNCS NUMBER(22), LIPQOH NUMBER(22),
LIMCU NCHAR(24), LILOCN NCHAR(40), LILOTN NCHAR(60), LILOTS NCHAR(2), IOMMEJ NUMBER(22))
CREATE OR REPLACE TYPE OHE AS TABLE OF Ohe1
CREATE OR REPLACE FUNCTION GET_ohe
return OHE PIPELINED
IS
m_rec ohe1:= ohe1 (NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL,0);
begin
for c in (select f1.LITM LITM, F1.AITM AITM, F1.DSC1 DSC1, F5.UNCS UNCS,
F21.QOH QOH, F21.MCU MCU, F21.LOCN LOCN, F21.LOTN LOTN, F21.LOTS LOTS,
F8.MEJ MEJ FROM F1 F1, F2 F2, F21 F21, F5 F5, F8 F8
WHERE (F5.EDG='07') AND (F21.QOH != 0) AND F2.IBITM = F1.IMITM
AND F21.ITM = F2.ITM AND F21.ITM = F5.ITM AND F21.MCU = F5.MCU
AND F21.MCU = F2.MCU AND F21.LOTN = F8.LOTN AND F21.MCU = F8.MCU)
loop
m_rec.LITM:=c.LITM;
m_rec.AITM:=c.AITM;
m_rec.DSC1:=c.DSC1;
m_rec.UNCS:=c.UNCS;
my_record.QOH:=c.QOH;
my_record.MCU:=c.MCU;
my_record.LOCN:=c.LOCN;
my_record.LOTN:=c.LOTN;
my_record.LOTS:=c.LOTS;
my_record.MEJ:=c.MEJ;
PIPE ROW (my_record);
end loop;
return;
end;
select LITM , AITM , DSC1 , UNCS*.0001 UNCS, QOH*.0001 QOH, (UNCS*.0001)*(QOH*.0001) AMOUNT,
MCU MCU, LOCN LOCN, LOTN LOTN, LOTS LOTS, jdate(DECODE(MEJ,0,100001,MEJ)) MEJ FROM
TABLE (GET_ohe)
WHERE trim(LIMCU)= TRIM(:OHE_BRANCHID)
AND (jdate(DECODE(MEJ,0,10001,MEJ)) >=:FROMEXPDT
AND jdate(DECODE(MEJ,0,10001,MEJ)) <=:TOEXPDATE)
The MEJ is a julian date and I am trying to convert it into a date ..... using the function jdate! and the pipelined function is created without any errors
and I am able to get the data with correct branch location bind variable but only problem is it is not binding the date filters in the sql.....
Thanks
Edited by: user10183758 on Oct 16, 2008 8:17 AM -
Pipelined function in reports6i....1
Hi,
i have a problem with using pipelined function in
reports6i.
can i use pipelined function in reports6i.
The following code is used to return rows
based on the parameter i am passing:
my package declaration and body is as follows:
PACKAGE P_RET_ARRAY IS
TYPE array1 AS TABLE OF NUMBER;
FUNCTION ret_array(str VARCHAR2)
RETURN ARRAY1 PIPELINED;
END;
PACKAGE BODY P_RET_ARRAY IS
FUNCTION ret_array(str VARCHAR2)
RETURN ARRAY1 pipelined
IS
str1 VARCHAR2(100);
num1 NUMBER(5);
BEGIN
str1 := str ||',';
WHILE LENGTH(str1)>=0
LOOP
num1 := TO_NUMBER(SUBSTR(str1,1,INSTR(str1,',',1)-1));
pipe (num1);
str1 := SUBSTR(str1,INSTR(str1,',',1)+1);
END LOOP;
--NULL;
RETURN ;
END;
END;
I got the above piece of code from one of the oracle forums:
now if i am trying to use this code in my reports6i it's not recognizing
pipelined.any suggestions plz .
it's urgent....Hi,
i have a problem with using pipelined function in
reports6i.
can i use pipelined function in reports6i.
The following code is used to return rows
based on the parameter i am passing:
my package declaration and body is as follows:
PACKAGE P_RET_ARRAY IS
TYPE array1 AS TABLE OF NUMBER;
FUNCTION ret_array(str VARCHAR2)
RETURN ARRAY1 PIPELINED;
END;
PACKAGE BODY P_RET_ARRAY IS
FUNCTION ret_array(str VARCHAR2)
RETURN ARRAY1 pipelined
IS
str1 VARCHAR2(100);
num1 NUMBER(5);
BEGIN
str1 := str ||',';
WHILE LENGTH(str1)>=0
LOOP
num1 := TO_NUMBER(SUBSTR(str1,1,INSTR(str1,',',1)-1));
pipe (num1);
str1 := SUBSTR(str1,INSTR(str1,',',1)+1);
END LOOP;
--NULL;
RETURN ;
END;
END;
I got the above piece of code from one of the oracle forums:
now if i am trying to use this code in my reports6i it's not recognizing
pipelined.any suggestions plz .
it's urgent.... -
Pipelined function with lagre amount of data
We would like to use pipelined functions as source of the select statements instead of tables. Thus we can easily switch from our tables to the structures with data from external module due to the need for integration with other systems.
We know these functions are used in situations such as data warehousing to apply multiple transformations to data but what will be the performance in real time access.
Does anyone have any experience using pipelined function with large amounts of data in the interface systems?It looks like you have already determined that the datatable object will be the best way to do this. When you are creating the object, you must enter the absolute path to your spreadsheet file. Then, you have to create some type of connection (i.e. a pushbutton or timer) that will send a true to the import data member of the datatable object. After these two things have been done, you will be able to access the data using the A3 - K133 data members.
Regards,
Michael Shasteen
Applications Engineering
National Instruments
www.ni.com/ask
1-866-ASK-MY-NI -
How do you pass parameters to a Pipelined function?
I am using Oracle 10G and the ODP .NET 32 bit client.
I am facing an issue trying to use variable binding with a pipeline function in Oracle. I am using ODP .NET for connecting to the database.
If you want to be familiar with PIPELINED functions, you can read [this blog.|http://oradim.blogspot.com/2007/10/odpnet-tip-using-pipelined-functions.html]
I have very similar code with a difference. My function takes in two parameters that I need to pass to get the table. This is working in SQLPLUS without any issues.
In my C# code, however things change. My function no longer returns a recordset (data reader), if I use the standard method of assigning the parameters.
The code will work if I concat the variables in a string.
Here is the example that doesn't work.
static OracleDataReader fetchData(OracleConnection oc, string strPONumber)
try
OracleCommand od = oc.CreateCommand();
od.CommandType = System.Data.CommandType.Text;
od.CommandText = "select * from table(pkg_fetchPOInfo.getPORowsTable(:1,:2))";
OracleParameter op1 = new OracleParameter();
op1.ParameterName = "1";
op1.OracleDbType = OracleDbType.Varchar2;
op1.Direction = System.Data.ParameterDirection.Input;
op1.Size = 7;
op1.Value = strPONumber;
od.Parameters.Add(op1);
OracleParameter op2 = new OracleParameter();
op2.ParameterName = "2";
op2.OracleDbType = OracleDbType.Varchar2;
op2.Direction = System.Data.ParameterDirection.Input;
op2.Size = 3;
op2.Value = "US";
od.Parameters.Add(op2);
OracleDataReader or = od.ExecuteReader();
return or;
catch (Exception e)
Console.WriteLine("Error " + e.ToString());
return null;
}Here is the example that does.
static OracleDataReader fetchData(OracleConnection oc, string strPONumber)
try
OracleCommand od = oc.CreateCommand();
string formSQL = "Select * from table(pkg_fetchPOInfo.getPORowsTable('"+strPONumber+"','US'))";
od.CommandType = System.Data.CommandType.Text;
od.CommandText = formSQL;
OracleDataReader or = od.ExecuteReader();
return or;
catch (Exception e)
Console.WriteLine("Error " + e.ToString());
return null;
}throw it into an anonymous block and it should work for you.
--create or replace type varcharTableType as table of varchar2 (4000);
create or replace
PACKAGE TESTP AS
function TESTPIPE(nr in number, nr2 in number) return varchartabletype pipelined;
END TESTP;
CREATE OR REPLACE
PACKAGE BODY TESTP AS
function TESTPIPE(nr in number, nr2 in number) return varchartabletype pipelined AS
CURSOR TESTPIPE_cur
IS
SELECT (level + 1) datam
FROM dual
connect by level < nr;
vtt varchartabletype ;
BEGIN
OPEN TESTPIPE_cur;
LOOP
FETCH testpipe_cur
BULK COLLECT INTO vtt LIMIT nr2;
FOR indx IN 1 .. vtt.COUNT
LOOP
Pipe Row ( vtt( indx ) ) ;
END LOOP;
EXIT WHEN testpipe_cur%NOTFOUND;
END LOOP;
END TESTPIPE;
END TESTP;
public static void pipeTest()
String conString = GetConnectionString();
OracleConnection _conn = new OracleConnection(conString);
_conn.Open();
OracleCommand oCmd = new OracleCommand();
oCmd.CommandText = "begin open :crs for Select * from table(testp.testpipe(:nr,:nr2)); end;";
oCmd.CommandType = CommandType.Text ;
oCmd.Connection = _conn;
OracleParameter crs = new OracleParameter();
crs.OracleDbType = OracleDbType.RefCursor;
crs.Direction = ParameterDirection.Output;
crs.ParameterName = "crs";
oCmd.Parameters.Add(crs);
OracleParameter nr = new OracleParameter();
nr.OracleDbType = OracleDbType.Int64;
nr.Direction = ParameterDirection.Input ;
nr.ParameterName = "nr";
nr.Value = 25;
oCmd.Parameters.Add(nr);
OracleParameter nr2 = new OracleParameter();
nr2.OracleDbType = OracleDbType.Int64;
nr2.Direction = ParameterDirection.Input;
nr2.ParameterName = "nr2";
nr2.Value = 10;
oCmd.Parameters.Add(nr2);
using (OracleDataReader MyReader = oCmd.ExecuteReader())
int ColumnCount = MyReader.FieldCount;
// get the data and add the row
while (MyReader.Read())
String s = MyReader.GetOracleValue(0).ToString();
Console.WriteLine(string.Format("i={0}", s));
Console.ReadLine();
} -
Hi,
Can any body tells when to use PIPELINE function in simple words.
Thanks,
Vinod910575 wrote:
Can any body tells when to use PIPELINE function in simple words.Wrong question.
Correct question - WHAT is a pipeline table function.
If you understand WHAT it is, you will be able to determine WHEN to use it.
So have you read the documentation? Tried coding your own pipeline function? Do you understand what it is and how it works? -
Returning Collection using table function
Hi,
I'm trying to return a collection with record type using table function but facing some issues.
Could someone help me with it.
SUNNY@11gR1> create or replace package test_pack as
2 type rec_typ is record (
3 empname varchar2(30),
4 empage number(2),
5 empsal number(10));
6 type nest_typ is table of rec_typ;
7 function list_emp return nest_typ;
8 end;
9 /
Package created.
Elapsed: 00:00:00.01
SUNNY@11gR1> create or replace package body test_pack is
2 function list_emp return nest_typ is
3 nest_var nest_typ := nest_typ();
4 begin
5 nest_var.extend;
6 nest_var(nest_var.last).empname := 'KING';
7 nest_var(nest_var.last).empage := 25;
8 nest_var(nest_var.last).empsal := 2500;
9 nest_var.extend;
10 nest_var(nest_var.last).empname := 'SCOTT';
11 nest_var(nest_var.last).empage := 22;
12 nest_var(nest_var.last).empsal := 3500;
13 nest_var.extend;
14 nest_var(nest_var.last).empname := 'BLAKE';
15 nest_var(nest_var.last).empage := 1;
16 return nest_var;
17 end;
18 end;
19 /
Package body created.
Elapsed: 00:00:00.01
SUNNY@11gR1> select * from table(test_pack.list_emp);
select * from table(test_pack.list_emp)
ERROR at line 1:
ORA-00902: invalid datatype
Elapsed: 00:00:00.01
SUNNY@11gR1>Regards,
SunnyBut if I use pipelined function instead then I'm able to retrieve the records
SUNNY@11gR1> create or replace package test_pack as
2 type rec_typ is record (
3 empname varchar2(30),
4 empage number(2),
5 empsal number(10));
6 type nest_typ is table of rec_typ;
7 function list_emp return nest_typ pipelined;
8 end;
9 /
Package created.
SUNNY@11gR1> ed
Wrote file afiedt.buf
1 create or replace package body test_pack as
2 function list_emp return nest_typ pipelined is
3 rec_var rec_typ;
4 begin
5 rec_var.empname := 'KING';
6 rec_var.empage := 24;
7 rec_var.empsal := 10000;
8 pipe row(rec_var);
9 rec_var.empname:='SCOTT';
10 rec_var.empage:=22;
11 rec_var.empsal:=2000;
12 pipe row(rec_var);
13 rec_var.empname:='BLAKE';
14 rec_var.empage:='1';
15 pipe row(rec_var);
16 return;
17 end;
18* end;
SUNNY@11gR1> /
Package body created.
Elapsed: 00:00:00.01
SUNNY@11gR1> select * from table(test_pack.list_emp);
EMPNAME EMPAGE EMPSAL
KING 24 10000
SCOTT 22 2000
BLAKE 1 2000
Elapsed: 00:00:00.00Why is that?
Regards,
Sunny -
Pipelined function, select from table t1 or t2 depending on user's choise
Hi all,
My need is to select data from table t1 or t2 depending on user's choise using pipelined function. You can find my first guess below. Maybe someone can help me to save some code, I mean getting the same result without writing "PIPE ROW" twice.
FUNCTION fn_indicators (p_datbeg date, p_datend date, p_indicatorid number) return cl_risk_act pipelined IS
v_obj cl_user_type;
BEGIN
case when p_indicatorid = 1 then
FOR e IN (
select trunc(sysdate-1) as adate, 0 as cid, 0 as indicatorid, '0' as code, '0' as indicatorname, 0 as value, 0 as cnt, '0' as cname from dual
LOOP
v_obj.adate := e.adate;
v_obj.cid := e.cid;
v_obj.indicatorid := e.indicatorid;
v_obj.code := e.code;
v_obj.indicatorname := e.indicatorname;
v_obj.value := e.value;
v_obj.cnt := e.cnt;
v_obj.cname := e.cname;
PIPE ROW (v_obj);
END LOOP;
when p_indicatorid = 2 then
FOR e IN (
select trunc(sysdate-2) as adate, 1 as cid, 1 as indicatorid, '1' as code, '1' as indicatorname, 1 as value, 1 as cnt, '1' as cname from dual
LOOP
v_obj.adate := e.adate;
v_obj.cid := e.cid;
v_obj.indicatorid := e.indicatorid;
v_obj.code := e.code;
v_obj.indicatorname := e.indicatorname;
v_obj.value := e.value;
v_obj.cnt := e.cnt;
v_obj.cname := e.cname;
PIPE ROW (v_obj);
END LOOP;
end case;
RETURN;
end;marco wrote:
Justin,
In my real code table real_t1 or pipelinedfn_t2 is joined to other tables, so surely real code is bigger than sample one. It is not wise to keep code twise with only one table name changed. I think about dynamic sql to choose from two tables:
with t1 as
(select * from real_t1
t2 as
(select * from pipelinedfn_t2
t3 as (
[dynamic selection of t1 or t2 depending on user's choise]
select * from t3, t... where...I don't know correct syntax.
Any ideas?
>Justin,
In my real code table real_t1 or pipelinedfn_t2 is joined to other tables, so surely real code is bigger than sample one. It is not wise to keep code twise with only one table name changed. I think about dynamic sql to choose from two tables:
with t1 as
(select * from real_t1
t2 as
(select * from pipelinedfn_t2
t3 as (
[dynamic selection of t1 or t2 depending on user's choise]
select * from t3, t... where...I don't know correct syntax.
Any ideas?
Dynamic code does NOT scale.
Making the tradeoff of smaller code size for reduced performance is not one that I would make. -
Pipelined function with huge volume
Hi all,
I have a table of 5 million rows with an average length of 1K for each row (dss system).
My SGA is 2G and PGA 1G.
I wonder if a pipelined function could support a such volume ?
Does anyone have already experienced a pipelined function with a huge volume ?
TIA
YangHello
Well, just over a month later and we're pretty much sorted. Our pipelined functions were not the cause of the excessive memory consumption and the processes are are now no longer consuming as much PGA as they were previously. Here's what I've learnt.
1. Direct write operations on partitioned tables require two direct write buffers to be allocated per partition. By default, these buffers are 256K each so it's 512K per partition. We had a table with 241 partitions which meant we inadvertently allocating 120MB of PGA without even trying. This is not a problem with pipelined functions.
2. In 10.2 the total size of the buffers will be kept below the pga_aggregate_target, or 64k per buffer, whichever is higher. This is next to useless though as to really constrain the size of the buffers at all, you need a ridiculously small pga_aggregate_target.
3. The size of the buffers can be as low as 32k and can be set using an undocumented parameter "_ldr_io_size". In our environment (10.2.0.2 Win2003 using AWE) I've set it to 32k meaning there will be 64k worth of buffers allocated to each partition significantly reducing the amount of PGA required.
4. I never want to speak to Oracle support again. We had a severity 1 SR open for over a month and it took the development team 18 days to get round to looking at the test case I supplied. Once they'd looked at it, they came back with the undocumented parameter which worked, and the ridiculous suggestion that I set the PGA aggregate target to 50MB on a production box with 4GB and 300+ dedicated connections. No only that, they told me that a pga_aggregate_target of 50MB was sensible and did so in the most patronising way. Muppets.
So in sum, our pipelined functions are working exceptionally well. We had some scary moments as we saw huge amounts of PGA being allocated and then 4030 memory errors but now it's sorted and chugging along nicely. The throughput is blistering especially when running in parallel - 200m rows generated and inserted in around 1 hour.
To give some background on what we're using pipelined functions for....
We have a list of master records that have schedules associated with them. Those schedules need to be exploded out to an hourly level and customised calendars need to be applied to them along with custom time-zone-style calculations. There are various lookups that need to be applied to the exploded schedules and a number of value calculations based on various rules. I did originally implement this in straight SQL but it was monsterous and ran like a dog. The SQL was highly complex and quite quickly became unmanageable. I decided to use pipelined functions because
a) It immensely simplified the logic
b) It gave us a very neat way to centralise the logic so it can be easily used by other systems - PL/SQL and SQL
c) We can easily see what it is doing and make changes to the logic without affecting execution plans etc
d) Its been exceptionally easy to tune using DBMS_PROFILER
So that's that. I hope it's of use to anyone who's interested.
I'm off to get a "pipelined fuinctions rule" tattoo on my face.
David -
Pipelined function in package example 11g
Hi all,
could you please show me example of using pipelined function in package with my sample data?
My need is to return the following data using pipelined function in package:
select 1 as t, 2 as y, 'u' as j, trunc(sysdate-1) as k from dual union all
select 3 as t, 4 as y, 'h' as j, trunc(sysdate-2) as k from dual Thanks ahead.p.s. if your problem is that you're not sure how to pipe multiple columns, take a look at this example (from my library of standard examples)...
SQL> CREATE OR REPLACE TYPE myemp AS OBJECT
2 ( empno number,
3 ename varchar2(10),
4 job varchar2(10),
5 mgr number,
6 hiredate date,
7 sal number,
8 comm number,
9 deptno number
10 )
11 /
Type created.
SQL> CREATE OR REPLACE TYPE myrectable AS TABLE OF myemp
2 /
Type created.
SQL> CREATE OR REPLACE FUNCTION pipedata(p_min_row number, p_max_row number) RETURN myrectable PIPELINED IS
2 v_obj myemp := myemp(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
3 BEGIN
4 FOR e IN (select *
5 from (
6 select e.*
7 ,rownum rn
8 from (select * from emp order by empno) e
9 )
10 where rn between p_min_row and p_max_row)
11 LOOP
12 v_obj.empno := e.empno;
13 v_obj.ename := e.ename;
14 v_obj.job := e.job;
15 v_obj.mgr := e.mgr;
16 v_obj.hiredate := e.hiredate;
17 v_obj.sal := e.sal;
18 v_obj.comm := e.comm;
19 v_obj.deptno := e.deptno;
20 PIPE ROW (v_obj);
21 END LOOP;
22 RETURN;
23 END;
24 /
Function created.
SQL> select * from table(pipedata(1,5));
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 17-DEC-1980 00:00:00 800 20
7499 ALLEN SALESMAN 7698 20-FEB-1981 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-1981 00:00:00 1250 500 30
7566 JONES MANAGER 7839 02-APR-1981 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-1981 00:00:00 1250 1400 30
SQL> select * from table(pipedata(6,10));
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7698 BLAKE MANAGER 7839 01-MAY-1981 00:00:00 2850 30
7782 CLARK MANAGER 7839 09-JUN-1981 00:00:00 2450 10
7788 SCOTT ANALYST 7566 19-APR-1987 00:00:00 3000 20
7839 KING PRESIDENT 17-NOV-1981 00:00:00 5000 10
7844 TURNER SALESMAN 7698 08-SEP-1981 00:00:00 1500 0 30
SQL> select * from table(pipedata(11,15));
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7876 ADAMS CLERK 7788 23-MAY-1987 00:00:00 1100 20
7900 JAMES CLERK 7698 03-DEC-1981 00:00:00 950 30
7902 FORD ANALYST 7566 03-DEC-1981 00:00:00 3000 20
7934 MILLER CLERK 7782 23-JAN-1982 00:00:00 1300 10
SQL> -
Execute pipelined function within other function .
Hi,
I'm on 9.2.0.8 , and got GUI application which can accept select only statements but I need kind of insert functionality.
So I've come up with clever idea and used pipelined functions with autonymous transaction to do inserts.
All looks like:
select * from table(opened_cursors_list)
select * from table(pgastat_list)
select * from table(sqlcosts_list)
all I need now is running this 3 function 1 after other in such way I can use select run_all_three() from dual;
or other way but called via select so my application gui can swallow it .
I've tried:
CREATE OR REPLACE Function gather_test_data
RETURN number
IS
cnumber number := 1;
BEGIN
select * from table(opened_cursors_list);
select * from table(pgastat_list);
select * from table(sqlcosts_list);
RETURN cnumber;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;but got error 6/2 PLS-00428: an INTO clause is expected in this SELECT statement
So look like I need some fake I dont know how its called 'collection' to deal with that .
I know thats whole think is kind of workaround but its working with that gui application :).
Any ideas how to call that pipelined functions ?
Regards.
GregGWell I did pipelined functions like that:
CREATE OR REPLACE function opened_cursors_list
return OPENED_CURSORS_table_type
pipelined
as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
for l_rec in (select sysdate datetime, st.value , se.program, se.MODULE , se.username
from v$sesstat st, v$session se
where
st.statistic# = 3
and st.sid = se.sid
and value > 100
order by value desc
LOOP
PIPE ROW (OPENED_CURSORS_scalar_type(l_rec.datetime,
l_rec.VALUE ,
l_rec.PROGRAM ,
l_rec.MODULE ,
l_rec.USERNAME ));
insert into opened_cursors values(l_rec.datetime,
l_rec.VALUE ,
l_rec.PROGRAM ,
l_rec.MODULE ,
l_rec.USERNAME);
commit;
END LOOP;
RETURN;
END;
/And its working, but as You said I think I need some dummy record to select into it.
It doesn't really matters what kind of dummy record. Just to fullfil pl/sql requirements .
So how to define such dummy record to select into it from pipelined function ?
Regards.
Greg
Edited by: GregG on Apr 5, 2011 12:40 PM -
Apex can't parse query on pipelined function
Hi,
I have a report based on a sql query which selects from a pipelined function. The pipeline function and the collection sql type it returns live in the parsing schema of the application.
I get the error: "Query cannot be parsed within the Builder." There is no ORA-xxxxx message.
If I check "generic columns" (parse at runtime), and run, it says "ORA-00904 <name of pipelined function>: invalid identifier".
If I qualify the name of the pipelined function with the schema name, it works.
Or, if I replace the bind variables with literals, it works.
Or, if I replace the columns with *, it works.
I'm using Apex 2.0
Does anyone have an ideas why I am seeing this behaviour?marnold,
Can you show the query you're using in your report?
I have used pipelined functions many times, you can see an example of how I've used them here -
http://jes.blogs.shellprompt.net/2006/05/25/generic-charting-in-application-express/
and I haven't encountered any significant problems. -
Pipelined functions with spatial data
hi,
i've been trying to use pipelined functions (using the TABLE and CAST operators to query data from them) to retrieve large amounts of spatial data.
i've followed the examples on metalink, and they work fine. my problem arises when i apply similar functions to query data using SDO_FILTER, i've been trying to pipe a mdsys.sdo_geometry datatype (ref cursor) into the function - returns null.
are spatial datatypes supported for use in pipelined functions, and using the table and cast operators?
if they are, where can i find further reading/reference on the subject?
thanks
santosh sewlalCheck out http://otn.oracle.com/products/spatial/pdf/mapviewerfaq_31.pdf
or
You can look for a third party solution that can draw maps.
Then you call out to this component from Forms.
Maybe you are looking for
-
I updated my iphone 4 to ios7.04 in itunes. In itunes, it appears that all my data/apps/music/etc are on the phone (but I cannot see anything on phone itself except setup screens). I am getting the ios7 setup screen on my iphone. I have selected
-
Backing up entire iTunes Library on external hard drive?
I have recently purchased an external hard drive to backup all media on my computer (photos, music etc). However, having searched apple.com for backup advice, the only instructions available refer to creating backup discs on an a CD. I have already c
-
Possible Adapter???
Greetings! My CRT monitor that was connected to my G3 finally died so I thought, "Hmmm, time to get a better Apple display." So I did my homework, or so I thought, purchased a 17" Studio Display (M7649) LCD Flat Panel, and then purchased the older DV
-
Help convert from 7 to 6.1
Hello all. Someone tried to answer my question but i can't open his file cuz i only have labview 6.1. could someone please convert it for me? thanks. Aquaphire ---USING LABVIEW 6.1--- Attachments: saveclock4.vi 21 KB
-
Hello folks, I need your help in following situation. My source-system has 1 RAID5 (600GB) over 5 HDDs. On the RAID-Disk are one primary partition (250GB) and 1 extended partitions (350GB). Because the hardware is out of support, I will migrate it to