Temp Table within an Stored Procedure
I'm pretty new to Oracle, but I have been developing in MS SQL for about 15. So I'm still getting use to the syntax and features within Oracle.
I'm trying to create a stored procedure that has two temporary tables within it, and then queries both them tables and inserts the results into a table.
I created the script but when they try to run in on the server it wont run. Can you guys tell me what I'm doing wrong?
CREATE OR REPLACE PROCEDURE UpdateFIDB_SP IS BEGIN CREATE GLOBAL TEMPORARY TABLE myAAAA AS (SELECT AAAA.1111, AAAA.2222, BBBB.3333_EXT, CCCC.4444, DDDD.5555, DDDD.6666, DDDD.7777, DDDD.8888, AAAA.9999, EEEE.1010, EEEE.1A1A, EEEE.1B1B, FFFF.3333_LO, FFFF.1C1C, AAAA.1D1D FROM mySchema.FFFF_07 FFFF RIGHT OUTER JOIN mySchema.EEEE EEEE ON FFFF.9999 = EEEE.1B1B RIGHT OUTER JOIN ( mySchema.DDDD DDDD RIGHT OUTER JOIN mySchema.AAAA AAAA ON DDDD.1D1D = AAAA.1D1D ) ON EEEE.PSPNR = AAAA.9999 LEFT OUTER JOIN mySchema.CCCC CCCC ON AAAA.3333 = CCCC.3333 LEFT OUTER JOIN mySchema.BBBB BBBB ON AAAA.3333 = BBBB.3333_INT GROUP BY AAAA.1D1D, AAAA.1111, AAAA.2222, BBBB.3333_EXT, CCCC.4444, DDDD.5555, DDDD.6666, DDDD.7777, DDDD.8888, AAAA.9999, EEEE.1010, EEEE.1A1A, EEEE.1B1B, FFFF.3333_LO, FFFF.1C1C ON COMMIT DELETE ROWS); CREATE GLOBAL TEMPORARY TABLE myGGGG AS (SELECT GGGG.1E1E, GGGG.1F1F, GGGG.1G1G, GGGG.1H1H, GGGG.1I1I, GGGG.1J1J, GGGG.1K1K, GGGG.R1D1D, GGGG.1L1L, GGGG.1M1M, GGGG.1N1N, GGGG.1O1O, GGGG.1P1P, GGGG.1Q1Q, HHHH.1R1R, IIII.1S1S, IIII.1T1T, IIII.1U1U, IIII.1V1V FROM mySchema.IIII IIII INNER JOIN mySchema.GGGG GGGG ON IIII.1K1K = GGGG.1K1K LEFT OUTER JOIN mySchema.HHHH HHHH ON GGGG.1L1L = HHHH.1W1W WHERE ( GGGG.1M1M IN ('20', '30') ) AND ( TO_DATE(IIII.1V1V, 'dd-mon-yyyy') = TO_DATE('31-DEC-9999','dd-mon-yyyy') ) AND ( TO_DATE(GGGG.1N1N, 'dd-mon-yyyy') >= TO_DATE('01-Jan-2011','dd-mon-yyyy') ) ON COMMIT DELETE ROWS); TRUNCATE TABLE FIDB; INSERT INTO FIDB (1111, 2222, 3333_EXT, 4444, 5555, 6666, 7777, 8888, 9999, 1010, 1A1A, 1B1B,3333_LO, 1C1C, 1D1D, 1E1E, 1F1F, 1G1G, 1H1H, 1I1I, 1J1J, 1K1K, R1D1D, 1L1L, 1M1M, 1N1N, 1O1O, 1P1P, 1Q1Q, 1R1R, 1S1S, 1T1T, 1U1U, 1V1V) SELECT myAAAA.1111, myAAAA.2222, myAAAA.3333_EXT, myAAAA.4444, myAAAA.5555, myAAAA.6666, myAAAA.7777, myAAAA.8888, myAAAA.9999, myAAAA.1010, myAAAA.1A1A, myAAAA.1B1B, myAAAA.3333_LO, myAAAA.1C1C, myAAAA.1D1D, myGGGG.1E1E, myGGGG.1F1F, myGGGG.1G1G, myGGGG.1H1H, myGGGG.1I1I, myGGGG.1J1J, myGGGG.1K1K, myGGGG.R1D1D, myGGGG.1L1L, myGGGG.1M1M, myGGGG.1N1N, myGGGG.1O1O, myGGGG.1P1P, myGGGG.1Q1Q, myGGGG.1R1R, myGGGG.1S1S, myGGGG.1T1T, myGGGG.1U1U, myGGGG.1V1V FROM myGGGG INNER JOIN myAAAA ON myGGGG.R1D1D = myAAAA.1D1D ORDER BY myGGGG.R1D1D; COMMIT; END;
Thanks!
Some people still sound mad at me because I have two queries and use temp tables
Because in Oracle, unlike in sql server, you generally do not NEED temp tables at all.
One of the biggest mistakes new Oracle developers make is to use PL/SQL when SQL will do the job just fine. Using PL/SQL when it isn't needed generally makes the code slower, less scalable and harder to maintain.
One of the biggest mistakes sql server developers make when they use Oracle is to use temp table when they aren't needed. They try to write code in Oracle exactly the same way they wrote it in sql server. That creates temp tables that aren't needed, makes their code perform horribly and also makes it less scalable and harder to maintain.
Oracle works differently and generally doesn't need ANY temp tables. You need to learn about how Oracle handles transactions and read consistency and how writers do NOT block readers and vice versa.
Create a new thread and post FORMATTED code that shows the PROBLEM you are trying to solve and we can show you the proper way to solve it. That 'proper way' will likely NOT include any need for or use of temp tables.
Similar Messages
-
Two temp tables in a Stored Procedure
Hi guys,
Is it feasable to use two stored procedures and form joins between them within a single stored procedure. I am trying a workaround for cursors in SYBASE.
Thanks,
DeveloperThis Create a temporary table in stored proc is a long and occasionally fractious discussion of the differences between temp tables in Oracle and MS SQL Server (and hence Sybase). You may wish to review it, or at least the links to the documentation.
Alternatively, expalin what it is the sybase code is doing and we will tell the best way to implement it in Oracle.
Cheers, APC -
A temp table in a stored procedure , set a value to varchar(MAX)
Hi ,,
In stored procedure there is a temp table and set a value to varchar(MAX) . What exactly is the different between setting it to varchar (MAX) instead of varchar(n)
Thank You
Jeevan VinayVinay,
Spend some time online to read and search about your problem before blindly posting it on forum, if you would have done that you could have found out eaisly below two links which will explain you in deep
http://stackoverflow.com/questions/3682821/difference-between-varchar500-vs-varcharmax-in-sql-server
http://sqlhints.com/2013/03/10/difference-between-sql-server-varchar-and-varcharmax-data-type/
Please mark this reply as answer if it solved your issue or vote as helpful if it helped so that other forum members can benefit from it
My Technet Wiki Article
MVP -
MySQL temp tables or Calling Stored procedures in CS4
I need to filter a result set by username before performing a LEFT JOIN and including OR IS NULL rows. The SQL works from from the mysqli client, by either creating a temp table using "create temporary table temp_appts select * from..." Or by creating a stored procedure which contains the same "create temp table" statement, then running my LEFT JOIN statement against the temp table.
I have tried both in CS4, it accepts the code in "code view" without errors but the page in a browser loads as a blank or a 500 error in IE. In my experience, this is caused by exiting before reaching the html header.
Is it possible to do either in CS4? Below is the code I am using.
$varU_temp_appts = "-1";
if (isset(<?php $_SESSION['MM_Username'])){
$varU_temp_appts =$_SESSION['MM_Username'];
mysql_select_db($database_ess, $ess);
$query_temp_appts = sprintf("CREATE TEMPORARY TABLE temp_appts SELECT * FROM appts WHERE username=%s", /GetSQLValueString($varU_temp_appts, "text"));
$temp_appts = mysql_query($query_temp_appts, $ess) or die(mysql_error());
$row_temp_appts = mysql_fetch_assoc($temp_appts);
$totalRows_temp_appts = mysql_num_rows($temp_appts);
mysql_select_db($database_ess, $ess);
$query_todays_appts = "SELECT * FROM appt_tm LEFT JOIN (temp_appts) ON appt_tm.appt_time=temp_appts.appt_hr WHERE(appt_date=CURDATE() OR appt_date IS NULL)";
$todays_appts = mysql_query($query_todays_appts, $ess) or die(mysql_error());
$row_todays_appts = mysql_fetch_assoc($todays_appts);
$totalRows_todays_appts = mysql_num_rows($todays_appts);
Any help is appreciated!chuck8 wrote:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'appt_tm LEFT JOIN (temp_appts) ON appt_tm.appt_time=temp_appts.appt_hr where tem' at line 1
I'm no expert on joins, but I know there were changes in MySQL 5.0.12 that resulted in queries that had previously worked failing. Go to http://dev.mysql.com/doc/refman/5.0/en/join.html, and scroll down to the section labelled Join Processing Changes in MySQL 5.0.12. -
Writing to a temp table in a stored procedure with dynamic sql
Hi
I am writing into a temp table with dynamic sql:
select coloum_name into #temp_table from
+
@DestinationDBName+'.information_schema.tables
and then I am trying to use #temp_table in the procedure:
select coloum_name into #anotherTable from #temp_table
but I am getting an error that #temp_table is not recognized.
Can a temp table not be used in dynamic sql ?
How can I overcome this problem ?Temp Table Can used easily in Dynamic Query in SQL Server and here is small Exmaple you can check it and do like it
CREATE PROC test
AS
BEGIN
CREATE TABLE #T1
(ID int , NAME Nvarchar(50))
CREATE TABLE #T2
(ID int , NAME Nvarchar(50))
DECLARE @SQL NVARCHAR(MAX)='Insert into #T1
SELECT database_id , Name FROM Sys.Databases
Insert into #T2 Select ID , Name from #T1 '
EXEC SP_ExecuteSQL @SQL
SELECT * FROM #T2
DROP TABLE #T1
DROP TABLE #T2
END
Exec Test
If you found My reply is helpful for you please vote me
thanks
Mustafa EL-Masry
Principle Database Administrator & DB Analyst
SQL Server MCTS-MCITP
M| +966 54 399 0968
MostafaElmasry.Wordpress.Com -
Creating a table/view or temporary table from within a stored procedure
Hi Gurus,
Can someone tell me if it is possible to create a table (or view) from within a stored procedure.
PROBLEM:
In fact I need to create a report at back end (without using oracle developer forms or reports). This report requires creating several tables to hold temporary report data. If I create a sql*plus script for this, i works fine, because it can run DDL and other sql or pl/sql statements sequencialy. But this sql*plus script cannot be called from application. So, application needs an stored procedure to do this task and then application call that procedure. But within stored procedure, i am unable to create table (or run any ddl statement). Can somebody help me in this?
Thanks in Advance.Denis,
The problem with Nicholas' suggestion isrelated to the fact that now you have two components
(a table and a stored procedure)
I don't see any problem to have "two
components" here. After all, what about all others
tabes ? This is only one more, but I don't understand
why want manage less objects, that implies more code,
more maintenance, and more difficulties to debug.
Needless to say about performance...
Nicolas.The same reasons apply if you were forced to declare all PL/SQL variables publicly (outside the stored proc.) rather than privately (from inside the stored proc). Naming conflicts for one. If the name that you want to use for the GTT already exists, you need to find a new name. With the SQL Server type local/private declarations, you wouldn't have that problem.
I can see how performance would be the same or better using GTTs. If the number of records involved is low, this is likely negligable. -
Returning a table from a stored procedure
hi, i need to return a table from a stored procedure and show it, and come to this, but a don't know hoy to run it, so i don't know if it is right, can anyone help me?
uTable out objects_uptime%rowtype
as
begin
select * into uTable from objects_uptime;
end;well, i finally discovered how to do the trick
this is the code for the function:
CREATE OR REPLACE FUNCTION FN_GET_RECORDS RETURN UPTIME PIPELINED IS
CURSOR cUptime is select * from objects_uptime;
p refcur.refcur_t;
temp p%ROWTYPE;
temp2 OUPTIME := OUPTIME(null, null, null, null, null, null, null, null, null);
BEGIN
OPEN cUptime;
LOOP
FETCH cUptime into temp;
temp2.OBJ_NAME := temp.OBJ_NAME;
temp2.IP := temp.IP;
temp2.STATUS := temp.STATUS;
temp2.DOE := temp.DOE;
temp2.ENABLED := temp.ENABLED;
temp2.COMMENT00000 := temp.COMMENT00000;
temp2.USERID := temp.USERID;
temp2.OBJECTID := temp.OBJECTID;
temp2.MNTID := temp.MNTID;
pipe row(temp2);
EXIT WHEN cUptime%NOTFOUND;
END LOOP;
RETURN;
END FN_GET_RECORDS;
and this for the auxiliar package, object and table:
CREATE OR REPLACE PACKAGE REFCUR
as
TYPE refcur_t IS REF CURSOR RETURN objects_uptime%ROWTYPE;
end REFCUR;
CREATE OR REPLACE TYPE OUPTIME AS OBJECT ( "OBJ_NAME"
VARCHAR2(255), "IP" VARCHAR2(20), "STATUS" VARCHAR2(10),
"DOE" DATE, "ENABLED" NUMBER(10, 1), "COMMENT00000"
VARCHAR2(1000), "USERID" VARCHAR2(50), "OBJECTID" NUMBER(10,
1), "MNTID" NUMBER(10, 1) )
CREATE TYPE TUPTIME AS
TABLE OF OUPTIME
i call it this way:
select * from table(FN_GET_RECORDS ())
if anyone knows how to do the same in a shorter manner, tell me please.
thanks to everybody for the help. -
Global Temp Tables in a Stored Proc
Hi All,
I'm trying to create a procedure that creates some tables and then creates global temporoay tables. This runs fine in a scrupt but when I place it in a proc, it fails with the following error
Error(172,10): PLS-00103: Encountered the symbol "TABLE" when expecting one of the following: := . ( @ % ;
I'm using the code below to create the global temp tables but I don't think you can do this in a procedure????
TRUNCATE TABLE TMP_table;
DROP TABLE TMP_table;
CREATE GLOBAL TEMPORARY TMP_table
ON COMMIT PRESERVE ROWS
AS SELECT
Thanks for any help givenWhy are you trying to create a temporary table in a stored procedure?
In Oracle, you almost certainly want to create the temporary table once at compile time just like any other table. The difference is that the data in a temporary table is local to the session.
If you really wanted to execute DDL in a stored procedure, you'd need to use dynamic SQL. But it's almost always a bad idea to do so.
Justin -
How can i create a Global Temporary Table inside a Stored Procedure....
Hi...
I need to create a Global Temporary Table inside a Stored
Procedure....
I have no idea how to do that....
Please....if u can send me a sample, send to me....
Thanks a lotTo create a global temporary table inside a stored procedure,
the minimal syntax would be:
CREATE OR REPLACE PROCEDURE procedure_name
AS
BEGIN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name'
|| '(column_name NUMBER)';
END procedure_name;
As Todd stated, it would probably be better to create the global
temporary table outside of the procedure:
SQL> CREATE GLOBAL TEMPORARY TABLE table_name
2 (column_name NUMBER);
Table created.
You can also specify things like ON COMMIT PRESERVE ROWS or ON
COMMIT DELETE ROWS.
It may be that there is something else, like a PL/SQL table of
records or a cursor, that would suit your needs better. It is
difficult to guess without knowing what you want to do with it. -
How to determine the load on the oracle server within a stored procedure?
Hi,
I have a subset of commands in my stored procedure that I would like to execute them only if there is not significant load on the database sever.
What would be the best way to measure the amount of load on my database server within a stored procedure?
Thank you,
AlanIt is not that easy.
This stored procedure is called by a job that runs every hour. Half of the stored procedure code are mission critical and must run by any means necessary! The second half must run right after the 1st one and is nice to do.
If I assign a lower priority it makes the situation worst, because then the job might take 3-4 hours and the same jobs run on top of each other over and over.
I just oversimplified the situation, The point is I prefer not to run the less important PLSQL code rather than assigning lower priority and stretch it over timeline. These hourly jobs are not Oracle jobs and cannot run on top of each other. Last time this happened and I had to kill 12 sessions! (12 jobs in 12 hour)
Trust me, estimating the load on the database server is the only solution.
When I say load on the server I mean the load resulted from other oracle sessions on the same database server. This server is a single instance Oracle 10g Enterprise on Solaris. All I need is just accessing to some meaningful counters.
Any help would be appreciated,
Alan -
How can L identify what are the not null fields of a table in a stored procedure ?
How can L identify what are the not null fields of a table in a stored procedure ?
You could query the data dictionary:
SELECT column_name
FROM all_tab_columns
WHERE owner = '...'
AND table_name = '...'
AND nullable = 'N' -
Creating temp table within OPEN QUERY
I am having trouble in creating a temp table within my OPEN QUERY.
How do I modify the below script to do this?
declare @sql nvarchar(max)
set @sql =
'SELECT *
FROM audit.dbo.Comp AS a
INNER JOIN audit.dbo.Pat AS b ON b.key = a.key
AND b.reg = ''' + @id + '''
INNER JOIN [prod].nfegh.dbo.flTest AS c ON c.id COLLATE Latin1_General_CI_AS = b.reg
INNER JOIN (
SELECT ''M1Q'' UNION ALL
SELECT ''M0Q'' UNION ALL
SELECT ''S1N''
) AS f(x) ON f.x = CLIN
WHERE a.inv IN (''CR'', ''R'', ''EAT'')'
set @sql = N'select * into MS_test1
from openquery( ocles, ''' + replace (@sql , '''' , '''''') + ''' )'
exec (@sql)OPENQUERY is designed to provide rows or to be user as target for DML.
But even when this statement would create a temporary table, then it would be out of scope. -
How Create a Global Temporary Table inside a Stored Procedure?
Hi...
I need to create a Global Temporary Table inside a Stored
Procedure....
I have no idea how to do that....
Please....if u can send me a sample, send to me....
Thanks a lotthere are many ways to do this..
one u can use dbms_utility package to run ddl statements like
for ex:
declare
t varchar2(200):='order_no';
v number;
begin
--dbms_utility.exec_ddl_statement('select '||t||' into '||v||'
from
--ordermaster where rownum=1');
dbms_utility.exec_ddl_statement('create table cvt(t number)');
dbms_output.put_line(v);
end;
but the actual method(recommended) involves a bit coding using
dbms_sql package you will find examples on technet or metalink
to use this package..
I hope this helps
Narendra -
Sending email from within a stored procedure
Is it possible to send and email within a stored procedure written in PL/SQL. I have searched this site and the web for an Oracle package which simulates a mail agent written in PL/SQL, but I have not had any success.
nullWell, on NT one way we did it was to link to kernel32.dll so we could execute OS commands (WinExec), and did the email that way.
Here's a bit of script to try:
connect sys/@db;
drop library kernellib;
CREATE LIBRARY kernellib as 'c:\winnt\system32\kernel32.dll';
show errors
CREATE OR REPLACE PACKAGE UTIL IS
function run(lpCmdLine IN varchar2, nCmdShow IN binary_integer) return binary_integer;
end;
show errors
CREATE OR REPLACE PACKAGE BODY UTIL IS
function run(lpCmdLine IN varchar2, nCmdShow IN binary_integer) return binary_integer
AS EXTERNAL
NAME "WinExec"
LIBRARY kernellib
parameters (lpCmdLine STRING, nCmdShow long);
end;
show errors
Then you just call util.run() with an appropriate command line to send email. Bit of a hack, but it depends on what you want to do with it. Another hack would be to use the UTL_HTTP package to submit a form to your web server and use a CGI program to send the email. -
How to create Nested table in oracle stored procedure(Temp Table)
Hi
I am creating Nested table in stored procedure(Temp Table)
type t_v_tbl_rec is record(cumid number,col1 varchar(50),col2 varchar(50),col3 varchar(50),col4 varchar(50),col5 varchar(50),col6 varchar(50));
type t_v_tbl is table of t_v_tbl_rec index by binary_integer;
V_V_TBL t_v_tbl;
But i can't insert value in to this temp table
Plz help meWhat is problem?
SQL>declare
2 type t_v_tbl_rec is record( cumid number,
3 col1 varchar(50),
4 col2 varchar(50),
5 col3 varchar(50),
6 col4 varchar(50),
7 col5 varchar(50),
8 col6 varchar(50) );
9 type t_v_tbl is table of t_v_tbl_rec index by binary_integer;
10 v_v_tbl t_v_tbl;
11 begin
12 v_v_tbl(1).cumid := 1;
13 dbms_output.put_line(v_v_tbl(1).cumid);
14 end;
15 /
1
PL/SQL procedure successfully completed.
Maybe you are looking for
-
i get this message-- The operation can't be completed because you don't have permission to access some of the items.
-
Duplicate messages in sent folder in hotmail
I am suing hotmail account on Mac/ apple Email. All messages sent from hotmail account are shown in duplicate in Sent folder. Its frustrating to delete these messages as I have a habit of keeping Sent folder empty after transferring the required mes
-
Please help !... So desperate !
Greetings ! I just created a web site for a client and it looks perfect on both IE7 and FireFox. We just find out that the horizontal Spry navigation is a complete mess on IE6. (See the screenshots below.) So i created a small demo page to illustrate
-
User CRYSTAL has no RFC authorization for function group BDL5
I am getting this error. Can anybody help. T:40527 Error in program 'boe_cmsd': ======> User CRYSTAL has no RFC authorization for function group BDL5. T:40527 Error in program 'boe_cmsd': <* RfcReceive [3] : returns 3:RFC_SYS_EXCEPTION T:40527 Error
-
need help to download the correct song...title is correct but song is not..