Create a temporary table as select fails... Why?

Hello, I have this simple stored procedure

PROCEDURE prueba_cursor is
BEGIN

CREATE TEMPORARY TABLE global emp_tab ON COMMIT PRESERVE ROWS AS
SELECT T.STATUS_CD IN THE T_CRES_FILES T;


END prueba_cursor;

I get the following error

"PLS-00103: encountered the symbol"CREATE"when waiting for one of the following values:

(begin case declare exit for goto if loop mod null pragma
raise return select update while < ID >


"

What's not here?
Thank you

Xavi says:
Hello, I have this simple stored procedure

PROCEDURE prueba_cursor is
BEGIN

CREATE TEMPORARY TABLE global emp_tab ON COMMIT PRESERVE ROWS AS
SELECT T.STATUS_CD IN THE T_CRES_FILES T;

END prueba_cursor;

I get the following error

"PLS-00103: encountered the symbol"CREATE"when waiting for one of the following values:

(begin case declare exit for goto if loop mod null pragma
lift the back updated select everything with

"

What's not here?
Thank you

You can't put DDL statements directly into the PL/SQL like this. Why you wrap upward in a PL/SQL procedure anyway?

Why not:

CREATE GLOBAL TEMPORARY TABLE  emp_tab ON COMMIT PRESERVE ROWS AS
      SELECT T.STATUS_CD FROM T_CRES_FILES T;

directly as SQL?

Tags: Database

Similar Questions

  • Create a temporary table using EXECUTE IMMEDIATE

    Hello

    I need to create a report more complex which must have three different queries. I use a determined IF clause that the query that uses the report, according to the parameters.

    I want to write the output to a csv file, so I created a PROCEDURE.

    The first package of the procedure has the three SQL and the IF clause in order to determine the query that the report uses and stores the query code in a variable (v_sql), which is passed to the PROCEDURE that needs to write to the output of the report.

    I tried to create a table with data from the request in order to make a LOOP and exit, something like this:

    WRITE_FILE (errBUFF of the PROCEDUREOUT VARCHAR2,
    retCODEOUT VARCHAR2,
    v_sqlIN VARCHAR2)

    IS

    ContorNUMBER;

    BEGIN

    EXECUTE IMMEDIATE v_sql;
    SLIDE G
    IS
    Select * from XXROR_REG_MF_TBL;
    --
    -initialization
    --
    retCode: = 0;
    errBUFF: = NULL;
    Contor: = 0;
    --
    -cursor
    --

    FOR X IN G
    LOOP
    APPS. FND_FILE.
    PUT_LINE)
    APPS. FND_FILE. OUTPUT,
    ....)

    I should mention that v_sql is something like:

    CREATE GLOBAL TEMPORARY TABLE ACEs (SELECT * of the double);

    I can't really do that, so I was wondering if you have any suggestions

    Thank you

    Claudiu

    Hello

    I don't think you need a table at all. You can set the cursor based on the SQL passed as parameter

    https://docs.Oracle.com/database/121/LNPLS/dynamic.htm#LNPLS629

    Concerning

    Marcus

  • Create a temporary table and insert using a select statement

    Hello

    I tried to create a temporary table and insert it by using the value in a select statement. Please see below the code

    ---
    CREATE a TEMPORARY TABLE GLOBAL Temp_Test
    (
    DATE OF DAY_FUTURE
    )
    AS
    SELECT TO_DATE (SYSDATE + ROWNUM, 'DD-MON-YY')
    DUAL CONNECT BY ROWNUM FROM < = 14)
    ---

    As soon as I run the script, the error message indicates the following:
    --

    Error from the 1 in the command line:
    CREATE a TEMPORARY TABLE GLOBAL Temp_Test
    (
    DATE OF DAY_FUTURE
    )
    ONLY select TO_DATE (sysdate + rownum, 'DD-MON-YY')
    Double connect rownum < = 14)

    Error in the command line: 2 column: 1
    Error report:
    SQL error: ORA-01773: cannot specify the types of data in this TABLE to CREATE column
    01773 00000 - 'cannot specify the types of column data in this TABLE to CREATE"
    * Cause:
    * Action:
    --


    What seems the problem? I already have the data type such as TO_DATE on my select statement.

    Any help would be appreciated

    Thank you
    SQL> CREATE GLOBAL TEMPORARY TABLE Temp_Test
      2  (
      3  DAY_FUTURE
      4  ) on commit preserve rows
      5  AS
      6  SELECT TO_DATE(SYSDATE+ROWNUM, 'DD-MON-YY')
      7  FROM DUAL CONNECT BY ROWNUM <= 14
      8  /
    
    Table created.
    
    SQL> select count(*)
      2    from temp_test
      3  /
    
      COUNT(*)
    ----------
            14
    
  • How to create a temporary table in a procedure.

    How to create a temporary table in a procedure.

    Hello

    user9093700 wrote:
    How to create a temporary table in a procedure.

    Why create a temporary table in a procedure?

    Oracle has soemthing called a global temporary Table , where the table is in fact permanent, but data is automatically deleted at the end of the session (or the transaction, depending on how the table was created). What did you talk about? Why do you want to create one in a procedure?

    Temporary tables, in the sense of the tables that are created on the fly and fell just as they are used, are almost never a good way to do anything in Oracle. Explain what you want to do, and someone will help you find a good way to do it.

    If you need really to create a table (or any other kind of DDL) in a procedure, use EXECUTE IMMEDIATE.

  • Create a temporary table of XmlType

    I am interested in other ways to achieve this.
    The solution below works when each statement is executed seperatly(Toad f5), but not at once (Toad F9)

    To run this from Java code, it is best to have it in a single queery/statement

    any ideas of ways to do this is very welcome.

    CREATE TABLE CONTROL_SETTINGS
    (
    CONTROL_SETTINGS_ID NUMBER (10) NOT NULL,
    SYS SETTINGS_XML. XMLTYPE,
    SETTINGS_NAME VARCHAR2 (128 CHAR) NOT NULL
    )

    CREATE TABLE COMPANY
    (
    COMPANY_ID int,
    company_name varchar (255)
    )

    INSERT INTO THE VALUES OF THE COMPANY (3456, '3456')

    SELECT * FROM COMPANY
    where company.company_name = '3456'

    INSERT INTO CONTROL_SETTINGS VALUES (5, XMLType ("< parameters >
    < order >
    < > 234 order_id < / order_id >
    < company > 3456 < / company >
    < / order >
    < order >
    < > 4563 order_id < / order_id >
    < company > 5674 < / company >
    < / order >
    ((< / Parameter > '), 'ORDER');


    create table
    map_order
    as
    (SELECT p.settings_name,
    extractValue (value (order_seq), "/ order/order_id") as order_id,.
    extractValue (value (order_seq), "/ order/company") as a business
    CONTROL_SETTINGS p,
    Table (XMLSequence (p.settings_xml.extract('/settings/order'))) order_seq
    WHERE p.settings_name like 'COMMAND');


    SELECT * from map_order
    LEFT JOIN map_order.company = company.company_name IT company;

    DROP TABLE map_order;

    There isn't a single if statement.

    The only thing you can do is to wrap in an anonymous block, but then all your DDL and DML that use the new table will have to be converted to dynamic SQL.

    What you do is a very bad idea.

  • Is there a way to create a temporary table whenever someone knocks a procedure?

    I'm creating a procedure in Oracle 10 g to retrieve data in Oracle in a cognos report. The problem with the creation of a permanent table, is that several people will run this report at the same time, which means that the procedure will take place whenever someone runs this report. The permanent table will be give up the old data or the data will mingle which means that the reports of the various peoples will not correct. I tried to put a lock on the tables that would release the lock once one person made run their report, but that did not work. I suggested that we put the data directly in the slider, but what happens when executing this procedure by several people at the same time?
    Any assistance in finding ways to solve this problem would be greatly appreciated.

    user10426897 wrote:
    According to our team cognos cognos 7 has been set up to be able to do that, but cognos 8 is not.

    Your Cognos team must then do some reading. Cognos 8 is quite able to query the tables directly, our Cognos team that regularly.

    John

  • MySQL temporary tables or call Stored procedures in CS4

    I need to filter the results by username before making a LEFT JOIN and including lines or IS NULL. The SQL works from the mysqli client, either by creating a temporary table using the "create a temporary table temp_appts select * from...» "Or by creating a stored procedure that contains the statement even 'create temporary table' and then running my LEFT JOIN statement against the temporary table.

    I've tried both in CS4, it accepts the code 'code' without errors but the page loads in a browser as a white or a 500 error in Internet Explorer. From my experience, this is caused by the exit before arriving to the html header.

    Is it possible to do either in CS4?  Here is the code I use.

    $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 SELECT temp_appts * of 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!

    Why not just use a derived table, rather than creating a temporary table?

  • What is the syntax for creating a global temporary table using a select query

    HII
    I create a global temporary table using a select query... How to speak of "on commit preserve rows ' who?


    create a table temporary global t1 select * from trn_ordbase on the lines of commit preserve;

    but this is an invalid syntax, then how to talk on commit preserve rows in this? If I don't mention, by default its recital on the validation of deleted rows.

    Please help me on this problem.
    create global temporary table t1 on commit preserve rows
      2  as select * from dual;
    
    Table created.
    
    TUBBY_TUBBZ?
    
  • Why the blocks of temporary tables are placed in the buffer cache?

    I read the following statement, which seems quite plausible to me: "Oracle7.3 and generates from close db file sequential reading of the events when a dedicated server process reads data from temporary segment of the disc." Older versions of Oracle would read temporary segment data in the database buffer cache using db file scattered reads. Releases latest exploit heuristics that data of temporary segment is not likely to be shareable or revisited, then reads it directly to a server process programs global (PGA). »

    To verify this statement (and also for the pleasure of seeing one of these rare close db file sequential read events), I ran a little experiment on my Oracle 10.2 Linux (see below). Not only it seems that different this v above, the blocks of temporary tables are placed in the buffer cache, but also$ BH. OBJD for these blocks does not refer to an object in the database's existing (at least not one that is listed in DBA_OBJECTS). Either incidentally, I traced the session and have not seen any file db close sequential read events.

    So, I have the following questions:
    (1) is my experimental set-up and correct my conclusions (i.e. are blocks of temporary tables really placed in the buffer cache)?
    (2) if so, what is the reason for placing blocks of temporary tables in the buffer cache? As these blocks contain private session data, the blocks in the buffer cache can be reused by another session. So why do all cache buffer management fees to the blocks in the buffer cache (and possibly remove) rather than their caching in a private in-memory session?
    (3) what V$ BH. OBJD consult for blocks belonging to temporary tables?

    Thanks for any help and information
    Kind regards
    Martin

    Experience I ran (on 10.2 /Linux)
    =============================
    SQL*Plus: Release 10.2.0.1.0 - Production on Sun Oct 24 22:25:07 2010
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options
    
    SQL> create global temporary table temp_tab_4 on commit preserve rows as select * from dba_objects;
    
    Table created.
    
    SQL> alter system flush buffer_cache;
    
    System altered.
    
    SQL> select count(*), status from v$bh group by status order by 1 desc;
    
      COUNT(*) STATUS
    ---------- -------
          4208 free
          3 xcur
    
    SQL> select count(*) from temp_tab_4;
    
      COUNT(*)
    ----------
         11417
    
    SQL> -- NOW THE BUFFER CACHE CONTAINS USED BLOCKS, THERE WAS NO OTHER ACTIVITY ON THE DATABASE
    select count(*), status from v$bh group by status order by 1 desc;
    SQL> 
      COUNT(*) STATUS
    ---------- -------
          4060 free
           151 xcur
    
    SQL> -- THE BLOCKS WITH THE "STRANGE" OBJD HAVE BLOCK# THAT CORRESPOND TO THE TEMPORARY SEGMENT DISPLAYED
    -- IN V$TEMPSEG_USAGE
    select count(*), status, objd from v$bh where status != 'free' group by status, objd order by 1 desc;
    SQL> SQL> 
      COUNT(*) STATUS      OBJD
    ---------- ------- ----------
           145 xcur       4220937
          2 xcur        257
          2 xcur        237
          1 xcur        239
          1 xcur    4294967295
    
    SQL> -- THE OBJECT REFERENCED BY THE NEWLY USED BLOCKS IS NOT LISTED IN DBA_OBJECTS
    select * from dba_objects where object_id = 4220937 or data_object_id = 4220937;
    
    SQL> 
    no rows selected
    
    SQL> SQL> -- THE BLOCKS WITH THE "STRANGE" OBJD ARE MARKED AS TEMP IN V$BH
    select distinct temp from v$bh where objd = 4220937;
    SQL> 
    T
    -
    Y
    
    SQL> 
    Edited by: user4530562 the 25.10.2010 01:12

    Edited by: user4530562 the 25.10.2010 04:57

    The reason to put the blocks to the global temporary table in the buffer cache is the same thing why you put ordinary table blocks in the cache buffers-> you want some of them to be in memory.

    If you ask why don't keep us somehow temporary tables in the PGA - well what happens if this temporary table will be 50 GB? 32-bit platforms cannot even handle this and you do not want a process of becoming uncontrollable so great.

    Moreover, TWG will allow you to restore, back to a backup (or savepoint implied when an error occurs during a call DML), and this requires protection by the cancellation. Place lines / revenge in PGA would have complicated the implementation even further... now GTT is almost of the regular tables which just happened to reside in temporary files.

    If you really want to put data in the PGA only, then you can create collections of PL/SQL and even access through the use of SQL (coll CAST AS xyz_type) where xyz_type is a TABLE of an object any.

    --
    Tanel Poder
    New online seminars!
    http://tech.e2sn.com/Oracle-training-seminars

  • How to create temporary tables in stored procedures.

    Hello

    I am new to oracle, I have a requirement where I need to run a query in a loop for different values of where condition. Here, I need to record the results of the query on each iteration. After the end of the loop, I need to send the results to the front end. I did a lot of research for the concept of the temporary table in oracle, but I found myself unresolved except headaches. Everyone is showing how to create temporary tables in general but not in stored procedure.

    Bad, I need the concept of temporary tables, or is there an alternative way to store temporary results. My procedure looks like this.

    create or replace
    procedure uspMatchCode (parWord varchar2, p_recorderSet to types.cursor_type)
    as
    smallint parCnt;
    Start
    parcnt: = 0;
    Select count (1) in parCnt of...;
    If parcnt > 0 then
    Open for P_recorderSet
    Select field1, field2, field3,... of table1, table2, table2 where < < condition > >
    on the other
    -Here, I want to create a temporary table and store the result for the loop shape into the temporary table.
    CREATE TEMPORARY TABLE global my_temp_table (NUMBER of Column1, Column2) ON COMMIT DELETE ROWS.
    FOR parCnt in 0.3
    loop
    INSERT into my_temp_table select Field1, Field2, field3,... from table1, table2, table2 where < < condition > >
    end loop;
    Open for P_recorderSet
    Select * from < < temporary table > >
    end if;
    end;

    Any help would be great to check me on the problem.

    Thank you
    Kiran.

    This is a change to the query Kiss has posted:

    with data_text like)
    Select regexp_substr (' sales financing marketing ',' [^] +', 1, level ") val
    of tconnect by level<= length('sales="" finance="" marketing')-="" length(replace('sales="" finance="" marketing','="">
    )
    Select * from t, data_text, where t.colname like '% "| data_text. Val |' %'

    This will help you. Please change the column names and the name of the table as a result

  • create temporary table

    Any syntax error in the code below?


    CREATE a TEMPORARY TABLE GLOBAL OWN.TT_tmp
    Did YOU SELECT distinct ssm_id, CAP.position pricing
    ON COMMIT PRESERVE ROWS;

    Error report:
    SQL error: ORA-00933: SQL not correctly completed command
    00933 00000 - "not correctly completed SQL command.
    * Cause:
    * Action:

    Hello
    Yes, there is a syntax error

    CREATE a TEMPORARY TABLE GLOBAL OWN.TT_tmp
    ON THE LINES OF COMMIT PRESERVE
    Did YOU SELECT distinct ssm_id, CAP.position pricing;

    Kind regards
    Simma...

  • Create temporary table in the procedure

    I have a procedure which can be called at any time by multiple users. So I cann't use table in there, because on each call, the table is truncated and inserted. How can I create a temporary table in the procedure?

    Temporary tables in Oracle are different from other RDBMS like SQL Server.

    In Oracle, you create a global temporary table ONCE as part of the design of your database.

    create a global temporary table MyTableName (... columns...) on commit preserve rows;

    You can then use this table in your code as you would any other table.

    The difference is that any data that you insert in this table are only available/visible so that the code runs in the session, and if delete you / truncate the table it only removes the data for this session.  In this way, several sessions we can table without interfering with each other.

    (Note: instead of "preserve" you can change this to "delete" If you want that deleted data automatically when a commit is issued in your session, otherwise the data will be automatically deleted at the end of the session)

  • Problem with create table as select (DEC)

    Hello

    We try to data cleaning of huge tables. And a customer of guise is reanme main table to the backup table. Then create a master table in select * backup table with some test.

    Now the problem with create table select, is that it creates the table without indexes and constraints. Is it possible to use the ETG (create the select table) with the same structure that he was the (all index, constriaints).

    Or any other solution to solve this problem?

    Thanks in advance

    Sweety wrote:
    Hello

    We try to data cleaning of huge tables. And a customer of guise is reanme main table to the backup table. Then create a master table in select * backup table with some test.

    Now the problem with create table select, is that it creates the table without indexes and constraints. Is it possible to use the ETG (create the select table) with the same structure that he was the (all index, constriaints).

    Or any other solution to solve this problem?

    Thanks in advance

    No, this is not possible. You need to get the manuscript of dependent object and create it manually.

  • Nested set tables in select query "in the clause of" take long time

    create or replace type t_circuitids is table of the varchar2 (100);

    -Under anonymous block continues to run away and never ends

    DECLARE
    v_circuitid t_circuitids;
    number of v_count;
    l_circuitids VARCHAR2 (4000)
    : = "Value1, value2, value3, value4, Value5";
    BEGIN
    -Query below converts the output concatinated with commas to the list and stores it in the nested table collection v_circuitids
    WITH an ACE
    (SELECT ',' | l_circuitids |) ',' AS circuitid
    THE DOUBLE)
    SELECT DISTINCT TRIM (SUBSTR (circuitid,
    INSTR (circuitid, "," 1, LEVEL) + 1.
    INSTR (circuitid, "," 1, LEVEL + 1)
    -INSTR (circuitid, "," 1, LEVEL)
    -1
    )
    ) cid
    LOOSE COLLECTION v_circuitid
    A
    CONNECT BY LEVEL <
    LENGTH (circuitid)
    -LENGTH (REPLACE (circuitid, ','));

    SELECT COUNT (1)
    IN v_count
    TABLE
    WHERE name IN (SELECT COLUMN_VALUE
    TABLE (v_circuitid));
    END;
    /

    -I had the question, query "SELECT COLUMN_VALUE FROM TABLE (v_circuitid)" that is used in code above is responsible for this.

    -Same code works fine in development and Test environments, but prod it continues to work on

    -I solved this problem by creating a temporary table, loading of all values in the collection in the temporary table and using this temporary table "in the clause" "

    -Can answer why his behavior like this when I use the collection where clause?

    -I use Oracle 9i

    Here is a summary of the question and the solution for this.

    -Nested type to collect multiple values

    CREATE or REPLACE the TYPE t_circuitid IS TABLE OF VARCHAR2 (100);

    Below the code will simply on the run.

    DECLARE
    v_circuitid t_circuitid;
    v_count NUMBER;
    BEGIN
    SELECT nal_name
    LOOSE COLLECTION v_circuitid
    OF fs_head
    WHERE groupid = 10;

    SELECT COUNT (1)
    IN v_count
    OF fs_attrib
    WHERE NAME IN (SELECT COLUMN_VALUE
    TABLE (v_circuitid));

    Dbms_output.put_line (v_count);
    END;
    /

    Cause:-SELECT COLUMN_VALUE TABLE (v_circuitid)); -This request is causing problem

    Why?  : - Because the CBO does not know how many lines is present in the collection, by default it takes 8168 lines

    Note:-always happens, it depends on the volume of data in the table, the path chosen by CBO. In my case, the table is huge on prod compared to DEV so he was causing a problem.

    -The following modified code works very well

    DECLARE
    v_circuitid t_circuitid;
    v_count NUMBER;
    BEGIN
    SELECT nal_name
    LOOSE COLLECTION v_circuitid
    OF fs_head
    WHERE groupid = 10;

    SELECT COUNT (1)
    IN v_count
    OF fs_attrib
    WHERE NAME IN (SELECT / * + cardinality (20 t) * /)
    COLUMN_VALUE
    TABLE (v_circuitid) t);

    Dbms_output.put_line (v_count);
    END;
    /

    Solution:-used as cardinality hint below.

    SELECT / * + cardinality (20 t) * / t COLUMN_VALUE TABLE (v_circuitid);

    Using cadinality I am saying CBO which dataset contains 20 lines or less.

    If it is version of Oracle 10 g and more, we can use below code (CARD utility).

    SELECT COLUMN_VALUE TABLE (CARD ((v_circuitid))

    For more information reach me at [email protected]

    Thank you best regards &,.

    Amarnath a. Reddy.

  • Global temporary tables in a stored Proc

    Hi all

    I am trying to create a procedure that creates tables, and then global temporoay tables. This works well 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 awaits one of the following values: =. ( @ % ;


    I use the code below to create global temporary tables, but I don't think that you can do in a procedure?

    TRUNCATE TABLE TMP_table;
    DROP TABLE TMP_table;
    CREATE GLOBAL TEMPORARY TMP_table
    ON THE LINES OF COMMIT PRESERVE
    IN SELECT

    Thanks for any help

    You cannot use dll phrases in a Begin End; block directly.

    Yun can use something like

    Begin
    Execute immediate 'TRUNCATE TABLE TMP_table';
    Execute immediate 'DROP TABLE TMP_table';
    Execute immediate 'CREATE GLOBAL TEMPORARY TMP_table ON COMMIT PRESERVE ROWS AS SELECT ';
    End;
    

Maybe you are looking for

  • incorrect synchronization

    Today, I decided to add a new device - my mobile with Android. Everything was ok - until I saw what happened on my PC... everthing, excuse me, fu * d upwards. Bookmarks and folders change the order. Also in one of the favorite folders are in a differ

  • Satellite A205-S4577 Motherboard upgrade

    I'm having the same problem as nskmartinez did in June 2011, My question is: If the motherboard has solved the problem or not, and I would like to change my motherboard in any case to a different Board which is faster.If it is possible as an i3, i5,

  • Satellite L40-143 PSL40E XP driver

    Hello I am looking for the driver for my ' * Satellite L40-143 PSL40E. " I need the driver for the sound card, WLAN and the video card, the best * all THE Drivers *)I need for Windows XP 32-bit. I search on the home page, and there are only drivers f

  • CHANGE DEFAULT EMAIL

    I use Gmail. There are many addons for direct links of mail through Gmail. The problem is electronic mail by default. It is located in Outlook. So if I right click on a file and select "send to" file is sent via outlook. I want to use Gmail for every

  • After upgrade to Vista, the desktop Setup does not save, but he returned each time unwanted installation

    My computer (laptop) did an automatic update of Vista. Since the restart, he lost all cookies, and all applications have behaved as if they were never used.  The files are OK. I had to reset the desktop resolution because it came with something too b