Table variable query optimisation

I have a table variable which (sometimes) needs to contain a couple of thousand rows, this slews the execution plan. This is fixed by DBCC TRACEON(2453) which causes the
rows in the table variable to be estimated properly, this requires sysadmin rights which I am reluctant to grant to other than this stored proc. The proc is excuted by most users with SQL authentication. I've tried with exec as 'NT AUTHORITY\SYSTEM' but that
does not seem to be recognized as I'm using sql authentication. Cant use a temp table as this breaks asp net Linq which is user to wrap the stored procedure.
Suggestions please? Is there another way to tell the proc to count the row in a table variable? Is there a tight scripted way to grant
sysadmin rights to just this stored proc across a number of databases and servers?

Hi Erland, I'm feeling particularly dumb at the moment... I read your article and each step seems clear. so I then tried to put together a script to create a certificate, create a logon, create a (SQL) user, create a proc to run as that user and test. My
dismal attempt is below.
USE master
go
-- Create a test login and test database
CREATE LOGIN testuser WITH PASSWORD = 'CeRT=0=TeST'
CREATE DATABASE certtest
go
-- Move to the test database.
USE certtest
go
-- Create the test user.
CREATE USER testuser
go
-- Create the test table and add some data.
CREATE TABLE testtbl (a int NOT NULL,
                      b int NOT NULL)
INSERT testtbl (a, b) VALUES (47, 11)
go
-- Create the certificate.
CREATE CERTIFICATE TraceOnCert
   ENCRYPTION BY PASSWORD = 'All you need is love'
   WITH SUBJECT = 'Certificate for TraceOnProc',
   START_DATE = '20020101', EXPIRY_DATE = '20200101'
go
-- Create the login
CREATE LOGIN TraceOnLogin WITH PASSWORD = 'CeRT=0=TeST'
GO
--create user link to login
IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'TraceOnUser')
    CREATE USER TraceOnUser FOR LOGIN TraceOnLogin
--give login sysadmin rights
EXEC master..sp_addsrvrolemember @loginame = N'TraceOnLogin', @rolename = N'sysadmin'
go
GRANT SELECT ON testtbl TO TraceOnUser
go
-- Create two test stored procedures, and grant permission.
CREATE PROCEDURE unsigned_sp AS
    DBCC TRACEON(2453)
   SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
   EXEC ('SELECT a, b FROM testtbl')
   DBCC TRACEOFF(2453)
go
CREATE PROCEDURE TraceOnProc WITH EXECUTE AS 'TraceOnUser' AS
    DBCC TRACEON(2453)
   SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token
   EXEC ('SELECT a, b FROM testtbl')
   DBCC TRACEOFF(2453)
   -- EXEC unsigned_sp
go
GRANT EXECUTE ON TraceOnProc TO public
GRANT EXECUTE ON unsigned_sp TO public
go
go
-- Run as the test user, to actually see that this works.
EXECUTE AS USER = 'testuser'
go
-- First run the unsigned procedure. This gives a permission error.
EXEC unsigned_sp
go
-- Then run the signed procedure. Now we get the data back.
EXEC TraceOnProc
go
-- Become ourselves again.
REVERT
go
-- Clean up
USE master
DROP DATABASE certtest
DROP LOGIN testuser
DROP LOGIN TraceOnLogin

Similar Messages

  • Fixing this Table Variable Query

    Please assist me to correct this syntax for this Table Variable Question below.   
    /* Create a table variable with Departure City and State in 2 different columns along 
    with Flight Destination City and Ontime. */
    DECLARE @NTable TABLE (FlightDepartureCity varchar(50), FlightDepartureCity1 varchar(50),FlightDestinationCity varchar(50), [Ontime] INT)
    INSERT INTO @NTable 
    SELECT Left(FlightDepartureCity,CHARINDEX('-',FlightDepartureCity)-1) as City,
    RIGHT(FlightDepartureCity,LEN(FlightDepartureCity) - CHARINDEX('-',FlightDepartureCity)) as FirstName,
    FlightDestinationCity, Ontime
    FROM Flights
    SELECT Left(FlightDepartureCity,CHARINDEX('-',FlightDepartureCity)-1),
        RIGHT(FlightDepartureCity,LEN(FlightDepartureCity) - CHARINDEX('-',FlightDepartureCity))  , 
        FlightDestinationCity, Ontime FROM @NTable

    Disregard I figured it out
    DECLARE @NTable TABLE (FlightDepartureCity varchar(50), FlightDepartureCity1 varchar(50),FlightDestinationCity varchar(50), [Ontime] INT)
    INSERT INTO @NTable 
    SELECT Left(FlightDepartureCity,CHARINDEX('-',FlightDepartureCity)-1) as City,
    RIGHT(FlightDepartureCity,LEN(FlightDepartureCity) - CHARINDEX('-',FlightDepartureCity)) as FirstName,
    FlightDestinationCity, Ontime
    FROM Flights
    SELECT * from @NTable

  • Query in SQL 2008R2 error Msg 1087, Level 15, State 2, Line 31 Must declare the table variable

    Hello Experts, 
    Can You help me; I get the follwing error in my query
    Msg 1087, Level 15, State 2, Line 31
    Must declare the table variable "@ASE_SUBART_GROEP".
    the @ASE_SUBART_GROEP is a self-defined table in this SQL environment.
    Maybe you know the error or the missing part
    Thanks in advance, Jos Dielemans

    I'm not familiar with SAP Business One unfortunately, so can only be of limited help here. But I'm going to guess that @ASE_SUBART_GROEP is a table variable passed to a stored procedure and is defined and passed down by the application, so you won't
    be able to copy-paste this code directly into management studio and get it to work.
    You could remove the join to return *all* records. Although the dataset might be very big
    SELECT T0.CardCode AS 'Klantnr'
    ,T0.CardName AS 'Klantnaam'
    ,T4.GroupName AS 'Klantgroep'
    ,T9.Descr AS 'Merknaam'
    ,T5.SlpName AS 'Verkoper'
    ,T3.MailCity AS 'Leverplaats'
    ,T7.NAME AS 'Leverland'
    ,T3.City AS 'Factuurplaats'
    ,T7.NAME AS 'Factuurland'
    ,T0.DocNum AS 'Documentnr'
    ,T0.DocDate AS 'Datum'
    ,Cast((Datepart(Year, T0.DocDate)) AS VARCHAR) AS 'Jaar'
    ,RIGHT('00' + CAST(DATEPART(MONTH, T0.DocDate) AS VARCHAR(2)), 2) AS 'Maand'
    ,(Cast((Datepart(Year, T0.DocDate)) AS VARCHAR) + '-' + RIGHT('00' + CAST(DATEPART(MONTH, T0.DocDate) AS VARCHAR(2)), 2)) AS 'Periode'
    ,T1.ItemCode AS 'Artikelnr'
    ,T2.ItemName AS 'Artikelnaam'
    ,T1.Quantity AS 'Aantal VEH'
    ,T2.SVolume AS 'Aantal EH per VEH'
    ,(T1.Quantity * T2.SVolume) AS 'Aantal EH'
    ,T8.UnitName AS 'EH-Naam'
    ,T6.ItmsGrpNam AS 'Artikelgroep'
    ,T2.U_ItemGrp AS 'Hoofdgroep'
    ,T10.NAME AS 'Subgroep'
    ,T1.CogsAcct AS 'Kostpr.rek.'
    ,T1.AcctCode AS 'Opbrengstrek.'
    ,T1.LineTotal AS 'BrutoOmzet'
    ,T0.DiscPrcnt AS 'Korting'
    ,(+ T1.LineTotal * (100 - T0.DiscPrcnt) / 100) AS 'NettoOmzet'
    FROM dbo.OINV T0
    INNER JOIN dbo.INV1 T1 ON T0.DocEntry = T1.DocEntry
    INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode
    INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode
    INNER JOIN OCRG T4 ON T3.GroupCode = T4.Groupcode
    INNER JOIN OSLP T5 ON T3.SlpCode = T5.SlpCode
    INNER JOIN OITB T6 ON T2.ItmsGrpCod = T6.ItmsGrpCod
    INNER JOIN OCRY T7 ON T3.Country = T7.Code
    LEFT OUTER JOIN OLGT T8 ON T2.SVolUnit = T8.UnitCode
    LEFT OUTER JOIN UFD1 T9 ON T3.U_ZPgroep = T9.FldValue
    AND TableID = 'OCRD'
    AND FieldID = 2
    --LEFT OUTER JOIN @ASE_SUBART_GROEP T10 ON T2.U_ASE_SUB_ARTGROEP = T10.Code
    WHERE T0.DocDate >= '20120101'
    AND T0.Canceled = 'N'
    UNION ALL
    SELECT T0.CardCode AS 'Klantnr'
    ,T0.CardName AS 'Klantnaam'
    ,T4.GroupName AS 'Klantgroep'
    ,T9.Descr AS 'Merknaam'
    ,T5.SlpName AS 'Verkoper'
    ,T3.MailCity AS 'Leverplaats'
    ,T7.NAME AS 'Leverland'
    ,T3.City AS 'Factuurplaats'
    ,T7.NAME AS 'Factuurland'
    ,T0.DocNum AS 'Documentnr'
    ,T0.DocDate AS 'Datum'
    ,Cast((Datepart(Year, T0.DocDate)) AS VARCHAR) AS 'Jaar'
    ,RIGHT('00' + CAST(DATEPART(MONTH, T0.DocDate) AS VARCHAR(2)), 2) AS 'Maand'
    ,(Cast((Datepart(Year, T0.DocDate)) AS VARCHAR) + '-' + RIGHT('00' + CAST(DATEPART(MONTH, T0.DocDate) AS VARCHAR(2)), 2)) AS 'Periode'
    ,T1.ItemCode AS 'Artikelnr'
    ,T2.ItemName AS 'Artikelnaam'
    ,- T1.Quantity AS 'Aantal VEH'
    ,T2.SVolume AS 'Aantal EH per VEH'
    ,(- T1.Quantity * T2.SVolume) AS 'aantal EH'
    ,T8.UnitName AS 'EH-Naam'
    ,T6.ItmsGrpNam AS 'Artikelgroep'
    ,T2.U_ItemGrp AS 'Hoofdgroep'
    ,T10.NAME AS 'Subgroep'
    ,T1.CogsAcct AS 'Kostpr.rek.'
    ,T1.AcctCode AS 'Opbrengstrek.'
    ,- T1.LineTotal AS 'BrutoOmzet'
    ,T0.DiscPrcnt AS 'Korting'
    ,(+ T1.LineTotal * (100 - T0.DiscPrcnt) / 100) AS 'NettoOmzet'
    FROM dbo.ORIN T0
    INNER JOIN dbo.RIN1 T1 ON T0.DocEntry = T1.DocEntry
    INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode
    INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode
    INNER JOIN OCRG T4 ON T3.GroupCode = T4.Groupcode
    INNER JOIN OSLP T5 ON T3.SlpCode = T5.SlpCode
    INNER JOIN OITB T6 ON T2.ItmsGrpCod = T6.ItmsGrpCod
    INNER JOIN OCRY T7 ON T3.Country = T7.Code
    LEFT OUTER JOIN OLGT T8 ON T2.SVolUnit = T8.UnitCode
    LEFT OUTER JOIN UFD1 T9 ON T3.U_ZPgroep = T9.FldValue
    AND TableID = 'OCRD'
    AND FieldID = 2
    --LEFT OUTER JOIN @ASE_SUBART_GROEP T10 ON T2.U_ASE_SUB_ARTGROEP = T10.Code
    WHERE T0.DocDate >= '20120101'
    AND T0.Canceled = 'N'
    ORDER BY T0.CardCode
    The join to the table variable has been commented out above, so the code should run. After that you might want to update the WHERE clause to include only particular sub-groups

  • RE: Table Variable error in a query

    Dear Readers, I am getting this error below when I create the table variable . Any ideas where I could be going wrong...
    Use GG_TS
    GO
    --Using table variable
    Declare @customerscount table
    (firstname char(30),
     totals int,
     customerNumber int)
    Insert @customerscount
    Select
          Customers.firstname,
          Count(*) as 'Totals',
          Orders.CustomerNumber
    FROM
         Customers join orders ON
         customers.customernumber = orders.customernumber
    Group BY
          customers.firstname,orders.customernumber
    The error I am getting is below:
    Incorrect syntax near the keyword 'table'.
    Thanks so much!
    SQL 75

    No, Now it's giving me a different error. Below is the error: By the way I am running this in SQL server 2012
    under tempDB as it is a table variable.
    Msg 208, Level 16, State 1, Line 6
    Invalid object name 'Customers'.
    Below is my Query:
    Declare @customerscount table
    (firstname char(30),
     totals int,
     customerNumber int)
    Insert @customerscount
    Select
          Customers.firstname,
          Count(*) as 'Totals',
          Orders.CustomerNumber
    FROM
         Customers join orders ON
         customers.customernumber = orders.customernumber
    Group BY
          customers.firstname,orders.customernumber
    Thank-you
    SQL 75
    No need to run this in tempdb
    You can run this in your database itself ie database where tables customers, orders etc exist and table variable gets created in tempdb itself
    The reason for your error is because it cant find the tables in the tempdb database
    So run the query in your own database
    Otherwise you need to change it as below if you stiil want this to be executed in tempdb
    Declare @customerscount table
    (firstname char(30),
    totals int,
    customerNumber int)
    Insert @customerscount
    Select
    c.firstname,
    Count(*) as 'Totals',
    o.CustomerNumber
    FROM
    <yourdbname>.dbo.Customers c join <yourdbname>.dbo.orders o ON
    c.customernumber = o.customernumber
    Group BY
    c.firstname,o.customernumber
     assuming dbo is your default schema
    Please Mark This As Answer if it solved your issue
    Please Mark This As Helpful if it helps to solve your issue
    Visakh
    My MSDN Page
    My Personal Blog
    My Facebook Page

  • Query Optimisation Problem

    Hi
    I have a problem regarding query optimisation, and in particularly one query. The query I have is for a view, and when I ran the cost on it, there were full table scans, and some costs were quite high:
    Select a.name, b.id, c.date
    from table a,
    table b,
    table c
    where a.id = b.id(+) and
    decode(a.version, null, a.num, a.version) = b.version(+) and
    a.id = c.id and
    b.type is null
    My question is whether this query can be made more efficient by removing the outer joins. I was thinking whether this could be carried out by some union or intersect query with an outer select. Is this possible, if so, what would be the best alternative query?
    Thanks

    Hi,
    Is b.type a NOT null column? Is the reason why you have b.type is null .. is to exclude the records that are present in both tableA and tableB, In that case try and see if this gives you the same result.
    select a.name,
           a.id,
           c.date
      from table1 a, table3 c
    where a.id = c.id
       and not exists
              (select 1
                 from table2 b
                where a.id = b.id
                  and nvl (a.version, a.num) = b.version)Make sure you have gathered statistics on the tables.
    And as sb92075 said above. Always mark a thread as answered once you get the answer. You need to help the forum as well rather than just taking help from the forum.
    G.

  • How to Use dyanamic table in query?

    Hi,
    can you please tell.in query -
    1] if we define a varibale and in that varibale we have to speacfy the dynamic table name can it's possible.
    2] I tried but it's not working
    3] Every year i have taken a backup table and from that backup table i feteched the data.But i want to do this programmatically
    e.g. Table name is pf_emp_pf_txn20122013 but this is "20122013" this dynamic .How we use in query that dyanamic table .
    Kindly Suggest,
    Regards,
    Sachin

    RHELSENSEI wrote:
    Your EXEC executes in a different context, therefore it is not aware of any variables that have been declared in your original context. You should be able to use a temp table instead of a table variable as shown in the simple demo below.
    create table #t (id int)
    declare @value nchar(1) set @value = N'1' 
    declare @sql nvarchar(max)
    set @sql = N'insert into #t (id) values (' + @value + N')'
    exec (@sql)
    select * from #t
    drop table #t
    Epic. Fail.
    SQL-Server syntax and features for an Oracle problem. Features that are not relevant at all to Oracle, but the very reason why SQL-Server is technically inferior to Oracle...
    Are you a professional idiot, or just a very gifted amateur?

  • Oracle equivalent to SQL Server Table Variables ?

    Does Oracle have anything equivalent to SQL Server table variables, that can be used in the JOIN clause of a select statement ?
    What I want to do is execute a query to retrieve a two-column result, into some form of temporary storage (a collection ?), and then re-use that common data in many other queries inside a PL/SQL block. I could use temporary tables, but I'd like to avoid having to create new tables in the database, if possible. If I was doing this in SQL Server, I could use a table variable to do this, but is there anything similar in Oracle ? SQL Server example:
    use Northwind
    DECLARE @myVar TABLE(CustomerID nchar(5), CompanyName nvarchar(40))
    INSERT INTO @myVar(CustomerID, CompanyName)
    select CustomerID, CompanyName
    from Customers
    --Join the variable onto a table in the database
    SELECT *
    FROM @myVar mv join Customers
    on mv.CompanyName = Customers.CompanyName
    The closest I've found in Oracle is to use CREATE TYPE to create new types in the database, and use TABLE and CAST to convert the collection to a table, as shown below. I can't see anyway without creating new types in the database.
    CREATE TYPE IDMap_obj AS Object(OldID number(15), NewID number(15));
    CREATE TYPE IDMap_TAB IS TABLE OF IDMap_obj;
    DECLARE
    v_Count Number(10) := 0;
    --Initialize empty collection
    SourceIDMap IDMap_TAB := IDMap_TAB();
    BEGIN
    --Populate our SourceIDMap variable (dummy select statement for now).
    FOR cur_row IN (select ID As OldID, ID + 10000000 As NewID From SomeTable) LOOP
    SourceIDMap.extend;
    SourceIDMap(SourceIDMap.Last) := IDMap_obj(cur_row.OldId, cur_row.NewId);
    END LOOP;
    --Print out contents of collection
    FOR cur_row IN 1 .. SourceIDMap.Count LOOP
    DBMS_OUTPUT.put_line(SourceIDMap(cur_row).OldId || ' ' || SourceIDMap(cur_row).NewId);
    END LOOP;
    --OK, can we now use our collection in a JOIN statement ?
    SELECT COUNT(SM.NewID)
    INTO v_Count
    FROM SomeTable ST JOIN
    TABLE(CAST(SourceIDMap As IDMap_TAB)) SM
    ON ST.ID = SM.OldID;
    DBMS_OUTPUT.put_line(' ' );
    DBMS_OUTPUT.put_line('v_Count is ' || v_Count);
    END;

    Hi, got this from our plsql guys:
    The term "table function" is a bit confusing here. In Oracle-speak, it means a function that can be used in the from list of a select statement thus:
    select * from Table(My_Table_Function()),..
    where...
    The function's return type must be a collection that SQL understands. So for the interesting case -- mimicking a function with more than one column -- this would be a nested table of ADTs where both the ADT and the nested table are defined at schema level. PL/SQL -- by virtue of some clever footwork -- allows you to declare the type as a nested table of records where both these types are declared in a package spec. This alternative is generally preferred, especially because the nested table can be of Some_Table%rowtype (or Some_Cursor%rowtype if you prefer).
    As I understand it from our man on the ANSI committee, our use terminology follows the standard.
    The construct below seems to be a bit different (though there are similarities) because it appears from your code sample that it's usable only within procedural code. And the object from which you select is a variable rather than a function.
    So, after that preamble... the answer would be:
    No, we don't have any constructs to let you "declare" something that looks like a regular schema-level table as a PL/SQL variable -- and then use (static) SQL on it just as if it were a schema-level table.
    But yes, you can use PL/SQL's pipelined table function to achieve much of the same effect.
    Look at the attached Table_Function.sql.
    It shows that you can populate a collection of records using ordinary PL/SQL code. You can't use SQL for insert, update, or delete on such a collection. I see that SQL Server lets you do
    insert into Program_Variable_Table select... from Schema_Level_Table
    The PL/SQL equivalent would be
    select...
    bulk collect into Program_Variable_Collection
    from Schema_Level_Table
    The attached shows that once you have populated your collection, then you can then query it with regular SQL -- both from inside PL/SQL code and from naked SQL.
    and the code is here
    CONNECT System/p
    -- Drop and re-create "ordinary" user Usr
    EXECUTE d.u
    CONNECT Usr/p
    create table Schema_Things(ID number, Description Varchar2(80))
    create package Pkg is
    subtype Thing_t is Schema_Things%rowtype;
    type Things_t is table of Thing_t; -- index by pls_integer
    Things Things_t;
    -- PLS-00630: pipelined functions must have
    -- a supported collection return type
    -- for "type Things_t is table of Thing_t index by pls_integer".
    function Computed_Things return Things_t pipelined;
    procedure Insert_Schema_Things(No_Of_Rows in pls_integer);
    end Pkg;
    create package body Pkg is
    function Computed_Things return Things_t pipelined is
    Idx pls_integer;
    Thing Thing_t;
    begin
    Idx := Things.First();
    while Idx is not null loop
    pipe row (Things(Idx));
    Idx := Things.Next(Idx);
    end loop;
    end Computed_Things;
    procedure Insert_Schema_Things(No_Of_Rows in pls_integer) is
    begin
    Things := Things_t();
    Things.Extend(No_Of_Rows);
    for j in 1..No_Of_Rows loop
    Things(j).ID := j;
    Things(j).Description := To_Char(j, '00009');
    end loop;
    insert into Schema_Things
    select * from Table(Pkg.Computed_Things());
    end Insert_Schema_Things;
    end Pkg;
    -- Test 1.
    begin Pkg.Insert_Schema_Things(100); end;
    select * from Schema_Things
    -- Test 2.
    begin
    Pkg.Things := Pkg.Things_t();
    Pkg.Things.Extend(20);
    for j in 1..20 loop
    Pkg.Things(j).ID := j;
    Pkg.Things(j).Description := To_Char(j, '00009');
    end loop;
    for j in 1..5 loop
    Pkg.Things.Delete(5 +2*j);
    end loop;
    end;
    select * from Table(Pkg.Computed_Things())
    /

  • Using Table Variables MSSQL with xMII 11.5

    I was trying an experiment with a query today where instead of creating a temp table in SQL, I used the T-SQL table variable.  For a simple example: 
    DECLARE @ProductTotals TABLE
    (  ProductID int,   Revenue money)
    INSERT INTO @ProductTotals (ProductID, Revenue)
    SELECT ProductID, SUM(UnitPrice * Quantity)
    FROM [Order Details]
    GROUP BY ProductID
    SELECT *
    FROM  @ProductTotals
    Well, this works fine in SQL Query Analyzer , but not in xMII.  I get a message that says "no results returned from this query"    So you ask, "why not just use a temp table"  Well on the real application, the query can take up to 30 seconds to run, and I have the chance of having multiple users execute the same query in that time, in which my temp table will get stomped on creating an error.  So I thought of using table variables as a possible alternative to avoid this.  
    I have already figured a work around, I put this code into a stored procedure and call that.  I could also do a similar workaround using separate queries / BLS.  However, I'm curious why xMII wouldn't execute this in the first place, being that it worked fine in Query Analyzer against the exact same database.

    Doug,
    I tried on my box with the "sqljdbc.jar" from 11.08.2006 (German Dateformat dd.MM.yyyy) and works also.
    For my test I had using the following SQL-Statement:
    DECLARE @ProductTotals TABLE
    ( ProductCount int, ProductID int, Revenue money)
    INSERT @ProductTotals
    SELECT count(O.ProductID) as ProductCount, P.ProductID, SUM(O.UnitPrice * O.Quantity)
    FROM [Order Details] O
    INNER JOIN Products P
    ON O.ProductID = P.ProductID
    GROUP BY P.ProductID
    SELECT *
    FROM @ProductTotals
    Did you get a result back in MII only for the SELECT statement
    SELECT count(O.ProductID) as ProductCount, P.ProductID, SUM(O.UnitPrice * O.Quantity)
    FROM [Order Details] O
    INNER JOIN Products P
    ON O.ProductID = P.ProductID
    GROUP BY P.ProductID
    ? My opinion is, that your select brings nothing back.
    Regards
    Pedro

  • Can i change table in query as per user given data

    hi master
    sir,
    can i change table in query as per user given data
    see
    select * from @variable
    i need use in lov
    please give me idea
    thankingyou
    Aamir

    You cant directly use in sql instead you can write an anonymous block and frame the query as per the input table name and then use execute immediate to execute the query.
    Something like this
    declare
    qry_table varchar2(30);
    qry_stmt varchar2(1000);
    type typ_sample is table of VARCHAR2(100) index by binary_integer;
    tab_sample typ_sample ;
    begin
    qry_table := &Table_name
    qry_stmt := 'select a from '||qry_table;
    execute immediate qry_stmt bulk collect into tab_sample ;
    end;
    Message was edited by:
    Shasi

  • What is the table for query name

    Hi All,
    I need an urgent requirement for removing duplicate technical query names from the production. Since there are few issues with the SAP given program I am customizing the SAP Program. Can any one tell me what is the table where the QUERY NAME and it's technical name can be found?
    Thanks,
    Alex.

    hi Alex,
    try RSRREPDIR, RSZCOMPDIR.
    there is one oss note all the tables.
    Table containing Work Book and query relation
    Query Detailes
    oss 792779
    Symptom
    Report ANALYZE_RSZ_TABLES is designed as a check-tool for detecting and solving different types of inconsistencies in the main query definition database tables.
    The program is recommended for BW system administrators.
    Other terms
    Query definition, query, reusable, component, variable, missing elements, missing records, missing UID, INCONSISTENCY, RSZELTDIR, RSZCOMPDIR, RSZCOMPIC, RSZGLOBV, RSZCALC, RSZSELECT, RSRREPDIR.
    Reason and Prerequisites
    ATTENTION: the described version of the program is delivered with the following Support Packages:
    SP27 for release BW 3.0B
    SP21 for release BW 3.1C
    SP13 for release BW 3.5
    All versions of this report available in systems before those Support Packages are test versions which can be used only for information purposes.
    Check prerequisites
    Checks are possible only for elements in object version 'A' (active) and 'D' (delivered).
    Checks for query elements in 'D' version are possible only in the systems which are set as content.
    Checks description
    Report performs checks in the tables containing the parts of the definitions of queries and query components: RSRREPDIR, RSZCOMPDIR, RSZCOMPIC, RSZGLOBV, RSZELTDIR and RSZELTXREF.
    1. Table RSRREPDIR
    The table RSRREPDIR is a header table of the generated reports. Consistency of query definition in this table allows to select a query in the Open Dialogs of fronted application and to call report generated for this particular query using transaction RSRT.
    The following errors can be found:
    - queries with missing definition;
    - queries with missing GENUNIID;
    - queries with technical names different than in RSZCOMPDIR;
    - non-queries in the table.
    1.1 Queries with missing definition
    The queries are available only in the table RSRREPDIR and not found in the table RSZELTDIR in the corresponding object version. Such queries (in active version) can be accessed only from RSRT transaction. An attempt to execute such query will return the short dump 'Exception condition INCONSISTENCY'. The error also happens during query generation in RSRT or during mass regeneration of the queries using RSR_GEN_DIRECT_ALL_QUERIES report or application menu of transaction RSRT. The inconsistent queries can not be repaired because of missing query definitions. The recommended solution is to delete those records in order to avoid the possible system dumps.
    1.2 Queries with missing GENUNIID
    Queries having empty GENUNIID field in the table RSRREPDIR. Such queries may be available in the frontend and in RSRT transaction. An attempt to execute such query will return the message'GENUNIID not found'. Situation requires additional investigation at SAP. Create an OSS message for BW-BEX-ET-QDEF.
    1.3 Queries with technical names different than in RSZCOMPDIR
    The check outputs the queries which have different technical names in the RSRREPDIR and RSZCOMPDIR tables. Execution of a query using the technical name given in Query Designer and stored in the table RSZCOMPDIR will return the error message 'GENUNIID not found'. The system tries to find the corresponding GENUNIID for the wrong COMPID which does not exist in the system or which belong to another query. The recommended solution is to correct the wrong COMPID in the table RSRREPDIR via corresponding procedure.
    1.4 Non-queries in the table
    The table RSRREPDIR normally contains only reports. Query elements of other types should not exist in this table and can be deleted. In case, when such records exist in the table an attempt to access them in RSRT returns the error message 'GENUNIID not found'. The recommended solution is to delete those records from the table using the corresponding procedure.
    2. Table RSZCOMPIC
    The table RSZCOMPIC contains an InfoProvider assignment for queries and other reusable query components (STR, RKF and CKF).
    The following errors can be found:
    - local elements in RSZCOMPIC;
    - components with inconsistent definition;
    - components based on non-existing InfoProviders;
    - components based on non-active InfoProviders.
    2.1 Local elements in RZSCOMPIC
    The table RSZCOMPIC contains an InfoProvider assignment for the reusable components. The local elements and also variables have no InfoProvider assignment and should not exist in this table. Those elements can be deleted via corresponding procedure.
    2.2 Components with inconsistent definition
    The reusable queries or query components existing in the table RSZCOMPIC, but not found in the table RSZELTDIR. Those reusable components may return 'Exception condition INCONSISTENCY' dump during accessing/execution. The situation may have different outcomes and has to be investigated at SAP. Create an OSS message for BW-BEX-ET-QDEF.
    2.3 Components based on non-existing InfoProviders
    Queries or query components are assigned to the InfoProviders which do not exist anymore in the system. Queries without InfoProvider are not available in Open Dialogs of frontend applications, but can be executed in RSRT. The execution will return the error message'InfoProvider not found'. The recommended solution is to delete the unnecessary components. Deletion of these queries or query components can be done directly from the list using corresponding procedure similar to RSZDELETE transaction.
    2.4 Components based on non-active InfoProviders
    Queries or query components which are assigned to the InfoProviders which do not exist in the system in the active version. Queries without active InfoProvider are not available in Open Dialogs of frontend applications. In case, an affected query is technically consistent, an attempt to execute it in transaction RSRT will return the message 'Activate the XXX InfoCube / InfoProvider again. Message #BRAIN 056'. Quite often this error is combined with other errors like missing GENUNIID in the RSRREPDIR or other inconsistencies. Each case has to be investigated in order to get the current status of this object. If the affected query is useless, it can be deleted from the system using transaction RSZDELETE.
    The check is available only for the query elements in object version 'A' (active).
    3. Table RSZCOMPDIR
    The table RSZCOMPDIR is the directory table containing the main properties of all reusable components.
    The following errors can be found:
    - duplicated technical names (COMPID);
    - components with inconsistent definition;
    - components without InfoProvider assignment;
    - components with missing OWNER.
    3.1 Duplicated technical names (COMPID)
    The check outputs queries or other reusable query components which have duplicated technical names (COMPID).
    The error does not cause any dumps in ABAP or terminations in Query Designer, but may cause several symptoms in different reporting areas:
    different queries are available in BEX Analyzer and RSRT under the same name;
    wrong query is used as Data Source for Web Template (Web Reporting, Reporting Agent, Broadcasting, MDX);
    replacement of variables does not work... etc.
    The recommended solution is to provide a new technical name for the duplicated component using corresponding procedure.
    ATTENTION: in case when there are only 2 components with the duplicated technical name, only one of those 2 components can be renamed using the corresponding procedure.
    The alternative solution for renaming the duplicated technical names is to use the ABAP report RENAME_DUPLICATE_ELEMENTS.
    3.2 Components with inconsistent definition
    Reusable query components which are not found in the element directory table RSZELTDIR are displayed. This situation may cause the short dump 'Exception condition INCONSISTENCY' during accessing the affected component in Query Designer or execution the affected query in RSRT. Further investigations are required at SAP. Create an OSS note for the SAP component BW-BEX-ET-QDEF.
    3.3 Components without InfoProvider assignment
    All reusable query component (except variables) should be assigned to a particular InfoProvider. This assignment is located in the table RSZCOMPIC. When the record is not found in this table, the affected component may become not available in Query Designer in the corresponding InfoProvider. In some cases the error message "Component XXX.. (version A) has no InfoCube assignment". Further investigations are required at SAP. Create an OSS note for the SAP component BW-BEX-ET-QDEF.
    3.4 Components with empty ONWER field
    Reusable components which have empty OWNER field in the table RSZCOMPDIR are accessible by users having $USER setting in the authorization object S_RS_COMP1 (users which are authorized to their own queries or query components). This leads to authorization concept violation.
    For error solution the field OWNER in the RSZCOMPDIR should be filled with any value. Execute the corresponding edit mode in order to fill the empty field with user 'SAP'. This will prevent the potential authorization violation for users with $USER setting and will take no effect on the users without this setting.
    4. Table RSZELTXREF
    The table RSZELTXREF contains all links and dependencies between the query elements within a query or query component.
    The following errors can be found:
    - missing elements (INCONSISTENCY dump);
    - not supported relations between query elements;
    - extended RSZELTXREF check.
    4.1 Missing elements
    Missing elements are those query elements which exist as the dependant objects (field TELTUID) in the table RSZELTXREF, but not available in the element directory table RSZELTDIR in corresponding object version. In case, when such elements are used in any query or other query components (STR, CKF or RKF), this may lead to ABAP short dump with 'Exception condition INCONSISTENCY' error message in query run-time or design-time. Other known symptoms of this error is, that structures, calculated key figures or restricted key figures are not available in an Info Provider in Query Designer during design-time.
    The missing elements which are in use in other queries or query components, can not be automatically repaired or deleted without components where those elements are used. In most cases the manual repair operations directly in the DB tables are required. Create an OSS message for SAP component BW-BEX-ET-QDEF for further investigations and creation of a repair plan.
    The missing elements which are not in use in any query or query components, can be deleted from the system via corresponding delete procedure. This deletion will not affect any existing query or query component.
    ATTENTION: if missing element is variable, it can be repaired in some cases automatically using the corresponding repair procedure. See table RSZGLOBV check 5.1. 'Variables with inconsistent definition' for details.
    4.2 Not supported relations between query elements
    Some relations between query elements which are not supported and can cause dumps in ABAP or terminations in Query Designer (for example link STR <--> VAR). Such cases have to be additionally investigated at SAP. Create an OSS message for SAP component BW-BEX-ET-QDEF.
    4.3 Extended RSZELTXREF check
    The extended RSZELTXREF check outputs 2 situations which, in combination with other conditions in the system, may be responsible for slow performance of all operations which involve select from the table RSZELTXREF and resolving the relations between query elements (query load, query generation, expanding of a variable list for corresponding InfoObject, expanding of a list of reusable components in Query Designer,... etc.):
    - records with empty INFOCUBE field
    - records which are not used in any query or query component
    Records with empty INFOCUBE field
    The current algorithm of resolving of relations between the query elements uses an optimization which allows to reduce the amount of data selected from the table RSZELTXREF during such operations are query load, query generate, expand a list of reusable components (STR, CKF, RKF) and so on. All relations between query elements within one reusable component based on one InfoProvider 'N' are also located within the same InfoProvider. The system has to select only records where the INFOCUBE field contain the same InfoProvider 'N' and in addition to this all other records where the INFOCUBE field is empty. This is necessary, because in all BW releases below 3.x the INFOCUBE field was not in the RSZELTXREF table and all components created before 3.x release have this field empty. Selection of records with empty INFOCUBE is required in order to ensure the consistency of processed query.
    When the number of records with empty INFOCUBE is quite large (50.000 - 1 mln records), any simple operation which require resolving of the relations may take a long time, because those records are always being selected, loaded to Query Designer and processed in the design-time.
    Records which are not used in any query or query component
    The program makes a virtual attempt to reconstruct the table RSZELTXREF via resolving the relations between all reusable components existing in the system. All records which are not used in any query or query components are considered as non-used records. Usually these are fragments of old queries or other components which are not deleted due to former errors in the query delete algorithm.
    The current version of the program contain only information about those 2 issues. See the OSS note 823804 for additional information.
    ATTENTION: the extended RSZELTXREF check is recommended when all critical problems with reusable components are resolved and the system clean-up is done (no useless records in the tables, no useless non-executable queries or other affected query component available).
    Starting from SP28 for BW 30B, SP22 for BW 31C and SP14 for BW 3.5 the Extended RSZELTXREF check detects and fixes the following situations:
    records used in existing queries or query components with empty INFOCUBE field;
    records used in existing queries or query components with wrong INFOCUBE assignment;
    records with or without INFOCUBE assignment which are not used in any query or query component.
    For further check details read the OSS note 859086.
    5. Table RSZGLOBV
    The table RSZGLOBV contains the definitions and technical properties of the variables.
    The following errors can be found:
    - variables with inconsistent definition;
    - variables with missing or incorrect properties;
    5.1 Variables with inconsistent definition. Variable not found in RSZELTDIR/RSZCOMPDIR tables.
    The variable existing in the table RSZGLOBV, but not existing in the tables RSZELTDIR or RSZCOMPDIR have inconsistent definition. These situation may return 2 different error messages. When a variable is missing in RSZELTDIR table (or in both together), an attempt to expand a list of variable under a corresponding InfoProvider or a list of text/formula variables will return a message 'Inconsistency in loading...'. All variables which are created for corresponding InfoProvider, text/formula variable are not available. When a variable is missing in the RSZCOMPDIR table only the error message is 'Missing UID XXXXXX... in RSZCOMPDIR! You may continue to work, but this component is not loaded' in Query Designer.
    In both cases the variables can be repaired via the corresponding procedure provided in the program under the technical name (COMPID) corresponding to the name in VNAM field in the table RSZGLOBV with the text 'REPAIRED BY SAP'.
    As an alternative solution, when the affected variables which are not used in any query or query component can be deleted directly from the RSZGLOBV table. Both solutions will fix the reported symptoms.
    ATTENTION: it is recommended to open a repaired variable in Variable Wizard of Query Designer and to adjust the definition of this variable, when it is necessary.
    ATTENTION: deletion of the affected variables missing in the table RSZCOMPDIR is not possible using transaction RSZDELETE. An attempt to delete such variable will return the error message 'Component not found'.
    5.2 Variables with missing or incorrect properties
    Several errors can be found within this check. The variables of different type have their own sets of properties. Missing or incorrect properties may cause different error message during execution of a query where such variables are in use. In the case of the affect variables with processing type 'replacement' , the replacement may not work because of the problem.
    Each case has to be investigated at SAP. Create an OSS message for SAP component BW-BEX-ET-QDEF.
    6. Table RSZELTDIR
    The table RSZELTDIR is the main directory table containing all query elements available in the system.
    ATTENTION: the RSZELTDIR check may take a long running time depending upon the table size.
    The following errors can be found:
    - local elements not in use;
    - reusable elements not in RSZCOMPDIR table;
    - reusable elements not in RSZCOMPIC table;
    - structure (STR) without structure members;
    - selections or RKF without definition in RSZSELECT table;
    - formulas or CKF without definition in RSZCALC table;
    - variables (VAR) without definition in RSZGLOBV table;
    - queries (REP) without entries in RSRREPDIR table.
    6.1 Local elements not in use
    Local elements (field REUSABLE = false) which are not used as dependant objects in the table RSZELTXREF. These elements are useless and not accessible from Query Designer. Usually these are fragments of the definitions of old queries accumulated in system because of different problems with save/delete procedures which are not accessible by the end users. The recommended solution is to delete those elements using the corresponding delete procedure.
    6.2 Reusable elements not in RSZCOMPDIR table
    Reusable elements (field REUSABLE = true) must have a corresponding entry in the table RSZCOMPDIR which contains the definition and properties of this reusable component. An attempt to load such component in Query Designer may cause the error message 'Missing UID XXXXXX... in RSZCOMPDIR! You may continue to work, but this component is not loaded'. Additional investigations are requires at SAP. Create an OSS message for BW-BEX-ET-QDEF.
    ATTENTION: Deletion of such affected components is also not possible using transaction RSZDELETE. An attempt to delete will return the message 'Component not found'.
    6.3 Reusable elements not in RSZCOMPIC table
    Reusable elements (field REUSABLE = true), except variables (DEFTP = 'VAR'), must have a corresponding entry in the table RSZCOMPIC which contains an InfoProvider assignment for reusable components. When a reusable component has no InfoProvider assignment it may be not available in Query Designer during design-time. Additional investigations are required at SAP. Create an OSS message for BW-BEX-ET-QDEF. In case the affected component is useless, it can be also deleted from the system using transaction RSZDELETE.
    6.4 Structures (STR) without structure members
    Reusable and non-reusable structures (DEFTP = 'STR') should have dependant elements (structure members). When these structure members are not found a query containing this structure returns the error message 'Element structure not correct' during generation or execution in RSRT or BEx analyzer. The program outputs a query technical name where such structures are used or the technical name of an InfoProvider if the affected structure is reusable and not used in any query. In this case it can be accessed from any query created in the same InfoProvider in Query Designer. The solution is to open the affected structure in using the latest available version of Query Designer and to create the required structure members in order to avoid the error message.
    In case, when the affecter structure is local (non-reusable) and is not used in any query, this structure is not accessible by frontend users and can be deleted from the system by corresponding procedure provided in the program.
    6.5 Local selection of RKFs without records in RSZSELECT table
    Local selections and reusable Restricted Key Figure (DEFTP = 'SEL') usually should have the corresponding records in the DB table RSZSELECT. The program outputs all selections found in the system which have no corresponding records in the RSZSELECT table.
    Usually this issue has no impact on the existing queries and produces no error messages. There are 3 possible types of selections within a query:
    Normal selection - this selection represents a characteristic in Row, Columns or Free Characteristics area, Conditions or Exceptions. This situation produces no error messages, but the selection is not taken into account by OLAP.
    Dummy structure member - structure member type selection can be defined using Query Designer. Such structure member produces no selection and can be used only as place holder within a query. This situation produces no error messages during generation/execution of a query containing a structure with those dummy structure members.
    Cell selection - this type of selection is usually used as Cell selection and can be defined using Cell Editor in Query Designer. This situation produces no error messages, but the selection is not taken into account by OLAP.
    If it is necessary, the selection definition can adjusted using the latest available version of Query Designer. The affected local selections can be accessed from the queries presented in the WHERE-USED (INFOCUBE/QUERY). The Restricted Key Figures are available in Query Designer from any query created on the corresponding InfoProvider.
    In case, when a local selection is not used in any query or query components the recommended solution is to delete this selection using the corresponding delete procedure.
    6.6 Local formulas of CKFs without records in RSZCALC table
    Local formulas (DEFTP = 'FML') or Calculated Key Figures (DEFTP = 'CKF') should contain definition of the calculations in the table RSZCALC. When such definition is not found in the table RSZCALC the queries or query components which include those affected objects can not be generated or executed by OLAP. An attempt to generate such query returns the error message 'The (sub) formula XXX... is not available'.
    The definitions of the affected formulas or Calculated Key Figures can be adjusted using the latest available version of Query Designer. The adjustment of a local formula is possible from the corresponding query listed presented in the program. The Calculated Key Figures are available in Query Designer from any query created on the corresponding InfoProvider.
    In case, when a local formula is not used in any query or query components the recommended solution is to delete this formula using the corresponding delete procedure.
    6.7 Variables without records in RSZGLOBV table
    Variables (DEFTP = 'VAR') should exist in the table RSZGLOBV. The table RSZGLOBV contains all processing properties and definition of the variables. Query where such variables are used can not be executed without problems.
    The repair procedure is not possible, because of missing definition. In case, when such variable is not used in any query, the recommended solution is to delete it from the system in order to avoid potential problems. If the affected variable is already used in other queries or query components, create an OSS message for SAP component BW-BEX-ET-QDEF. Further investigations and possible repair plan have to be created at SAP.
    6.8 Queries without records in RSRREPDIR table
    Queries (DEFTP = 'REP') should exist in the table RSRREPDIR. The table RSRREPDIR is a header table of generated reports and also a part of the database view V_REP_JOIN which provides data for the BEx Open/Save Dialogs.
    A query which does not exist in the table RSRREPDIR is not accessible via RSRT transaction (error message 'GENUNIID not found') and not displayed in the Open/Save Dialogs of fronted applications.
    The recommended solution is to delete such queries using the corresponding procedure provided in the program and similar to RSZDELETE.
    In some cases the repair procedure is also possible. The success of the repair procedure depends upon the consistency of the affected query, the existence of a valid InfoProvider for this query and some other factors. For repair attempt create an OSS message for the SAP component BW-BEX-ET-QDEF.
    hope this helps.

  • Can someone explain this crazy query optimisation?

    A software company has me trialling a product that has a query optimiser. I can't for the life of me explain what is going on below and would like some help from someone with a bit more SQL experience. I have a query I've been struggling to bring down the time on:
    CREATE OR REPLACE VIEW PLATE_STATS_DATA_VIEW AS
    SELECT P.Folder_ID, P.expt_or_control_ID, P.Plate_Type, P.Dose_Weight, P.Volume, P.Strain_Code, P.S9_Plus,
    P.type_Name as Contents, P.Replicate_ID,
    P.Number_Of_Plates, round(avg(P.count)) as mean_count,
    min(P.count) as min_count, max(P.count) as max_count, count(P.count) as Plates_Counted
    FROM expt_folder_plates P, History_Control_Log L
    WHERE P.expt_or_control_ID = L.Control_ID
    AND P.Strain_Code = L.Strain_Code
    AND P.Plate_Type = L.Type_Code
    AND P.S9_Plus = L.S9_Plus
    AND L.control_Included > 0
    GROUP BY P.Folder_ID, P.expt_or_control_ID, P.Plate_Type, P.Dose_Weight, P.Volume, P.Strain_Code,
    P.S9_Plus, P.type_Name, P.Replicate_ID, P.Number_Of_PlatesIt took 20 seconds on my large test database, so I put it through the optimiser. It took it down to 0.1 seconds simply by changing 'WHERE P.expt_or_control_ID = L.Control_ID' to 'WHERE P.expt_or_control_ID = L.Control_ID + 0'.
    I have no idea why this would make any difference - adding zero to a value?! Can anyone enlighten me?
    Many thanks,
    Gary
    Message was edited by:
    GaryKyle

    Ahhh, thanks guys. I'm a bit of a beginner here. This is my first look at explain plans - just had to work out how to see them! I think I understand what is happening now - it looks like that with the index, it does the group by FIRST on all the data and this takes a large amount of time. Am I right?
    Before +0:
    SELECT STATEMENT, GOAL = ALL_ROWS               Cost=162787Cardinality=1380965Bytes=328669670
    SORT GROUP BY               Cost=162787     Cardinality=1380965     Bytes=328669670
      HASH JOIN               Cost=16773     Cardinality=1380965     Bytes=328669670
       TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=EXPT_FOLDER_DETAILS     Cost=29Cardinality=4038Bytes=387648
       HASH JOIN               Cost=16730     Cardinality=1380965     Bytes=196097030
        TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=AMES_PLATE_TYPES     Cost=2Cardinality=6Bytes=192
        HASH JOIN               Cost=16715     Cardinality=1380965     Bytes=151906150
         TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=HISTORY_CONTROL_LOG     Cost=2Cardinality=40Bytes=880
         HASH JOIN               Cost=16694     Cardinality=2002400     Bytes=176211200
          HASH JOIN               Cost=59     Cardinality=8076     Bytes=282660
           TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=EXPT_FOLDER_SOLVENTSCost=2Cardinality=3Bytes=51
           TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=CONTROLSCost=56Cardinality=8078Bytes=145404
          TABLE ACCESS FULL     Object owner=PI_AMES_BIGObject name=EXPT_FOLDER_PLATESCost=16584Cardinality=5499657Bytes=291481821After +0:
    SELECT STATEMENT, GOAL = ALL_ROWS               Cost=1655     Cardinality=138     Bytes=45954
    HASH JOIN               Cost=1655     Cardinality=138     Bytes=45954
      HASH JOIN               Cost=1625     Cardinality=138     Bytes=33672
       HASH JOIN               Cost=1569     Cardinality=414     Bytes=96462
        MERGE JOIN CARTESIAN     Cost=4          Cardinality=18     Bytes=630
         TABLE ACCESS FULL          Object owner=PI_AMES_BIG     Object name=EXPT_FOLDER_SOLVENTSCost=2Cardinality=3Bytes=30
         BUFFER SORT          Cost=2     Cardinality=6     Bytes=150
          TABLE ACCESS FULL          Object owner=PI_AMES_BIG     Object name=AMES_PLATE_TYPESCost=1     Cardinality=6Bytes=150
        VIEW               Object owner=PI_AMES_BIG     Object name=TEST_PLATE_STATSCost=1564Cardinality=138Bytes=27324
         SORT GROUP BY               Cost=1564     Cardinality=138     Bytes=10350
          TABLE ACCESS BY INDEX ROWID     Object owner=PI_AMES_BIGObject name=EXPT_FOLDER_PLATESCost=39Cardinality=3Bytes=159
           NESTED LOOPS               Cost=1563     Cardinality=138     Bytes=10350
            TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=HISTORY_CONTROL_LOG     Cost=2Cardinality=40Bytes=880
            INDEX RANGE SCAN     Object owner=PI_AMES_BIG     Object name=EXPT_CONTROL_ID_INDEXCost=5Cardinality=248     
       TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=CONTROLSCost=56     Cardinality=8078Bytes=88858
      TABLE ACCESS FULL     Object owner=PI_AMES_BIG     Object name=EXPT_FOLDER_DETAILS     Cost=29     Cardinality=4038Bytes=359382Thanks again,
    Gary
    P.S. looks like the explain plan's made the post horribly wide again ;) sorry. I'll keep it this way though otherwise the plan is hard to read.

  • How to see lock on table and query?

    Hi All,
    How do we see lock on table and query?
    Thanks,
    Rafi

    Yes Rafi,
    It is working fine at my end. See below:
    Opened Session 1 with scott/tiger and:
    update emp set ename='xx' where empno=7499;
    Opened Session 2 with scott/tiger and:
    update emp set ename='xx' where empno=7499;
    <<Its lock here>> This session is locked by above one.
    Opened Session 3 with sys/pw as sysdba and:
    SQL> set serveroutput on
    SQL> BEGIN
      2  dbms_output.enable(1000000);
      3  for do_loop in (select session_id, a.object_id, xidsqn, oracle_username, b.owner owner,
      4  b.object_name object_name, b.object_type object_type
      5  FROM v$locked_object a, dba_objects b
      6  WHERE xidsqn != 0
      7  and b.object_id = a.object_id)
      8  loop
      9  dbms_output.put_line('.');
    10  dbms_output.put_line('Blocking Session : '||do_loop.session_id);
    11  dbms_output.put_line('Object (Owner/Name): '||do_loop.owner||'.'||do_loop.object_name);
    12  dbms_output.put_line('Object Type : '||do_loop.object_type);
    13  for next_loop in (select sid from v$lock
    14  where id2 = do_loop.xidsqn
    15  and sid != do_loop.session_id)
    16  LOOP
    17  dbms_output.put_line('Sessions being blocked : '||next_loop.sid);
    18  end loop;
    19  end loop;
    20  END;
    21  /
    Blocking Session : 139
    Object (Owner/Name): SCOTT.EMP
    Object Type : TABLE
    Sessions being blocked : 134
    PL/SQL procedure successfully completed.HTH
    Girish Sharma

  • Can we create prompts in Derived Table sql query

    Hi,
    I am trying to define derived table sql query as below. Though the syntax parsing is going through but when I am generating the report it is throwing and invalid prompt definition error.
    " select * from table_a where call_direction = @Prompt('Enter Call Direction','A','"derivedtable_a".SHORT_STRING',mono,free,not_persistent,) and
    where call_type = @Prompt('Enter Call Direction','A','"derivedtable_b".SHORT_STRING',mono,free,not_persistent,) "
    Can somebody please share your thoughts if this can be achieved in universe or not ?
    Appreciate immediate responses as it is a show stopper for my deliverable.
    Thanks in advance.
    Thanks and Regards,
    Shireen.

    Hi Shireen
    We can use prompt in the derived table. There is issue with the SQL that you have used while creating the Derived Table.
    Instead of using the "derivedtable_a".SHORT_STRING' field use the object from the class on which you are creating the derived table.
    For example: If you are creating a derived table in the sample universe efashion on Agg_yr_qt_rn_st_ln_ca_sr table then use the following query:
    SELECT *
    FROM Agg_yr_qt_rn_st_ln_ca_sr
    WHERE Agg_yr_qt_rn_st_ln_ca_sr.Yr = @Prompt ('Enter Value','C','Time Period\Year',mono,constrained)
    Hope this helps!
    Thanks

  • Linking logical database to TABLE in query

    Can we link Logical Database to Table during query creation in tcode SQVI
    Message was edited by:
            rohith modi
    Message was edited by:
            rohith modi

    go to sqvi and select "Table Join"in data source and enter title select radio button for "basis mode" and enter u reach a new screen in that new screen press "insert table" and give ur table name and again  press "insert table" and give another table in thsi way we can joint table in ABAP query.
    reward points if it is helpful

  • Open sys_refcursor for select from table variable?

    Hi,
    I've got a challenge for you! :-)
    I've got a procedure that has a lot of logic to determine what data should be loaded into a table variable. Because of various application constraints, i can not create a global temporary table. Instead, i'd like to create a table variable and populate it with stuff as i go through the procedure.
    The end result of the procedure is that i must be able to pass the results back as a sys_refcursor. This is a requirement that is beyond my control as well.
    Is there a way to make this sort of procedure work?
    Create Or Replace Procedure Xtst
    Mu_Cur In Out Sys_Refcursor
    Is
    Type Xdmlrectype Is Record (Col1 Varchar2(66));
    Type Xdmltype Is Table Of Xdmlrectype;
    Rtn Xdmltype;
    Begin
    Select Internal_Id Bulk Collect Into Rtn From Zc_State;
    open mu_cur for select col1 from table(rtn);
    end;
    11/42 PLS-00642: local collection types not allowed in SQL statements
    11/36 PL/SQL: ORA-22905: cannot access rows from a non-nested table item
    11/19 PL/SQL: SQL Statement ignored
    Show Errors;

    Not anything i'd want to personally implement.
    But for educational purposes only of course....
    create table this_will_be_gross
       column1 number,
       column2 varchar2(30)
    insert into this_will_be_gross values (1, 'begin the ugliness');
    insert into this_will_be_gross values (2, 'end the ugliness');
    variable x refcursor;
    ME_XE?
    declare
       Rtn sys.ODCIVARCHAR2LIST;
    BEGIN
       SELECT
          column1 || '-' || column2 Bulk Collect
       INTO
          Rtn
       FROM
          this_will_be_gross;
       OPEN :x FOR
       SELECT 
          regexp_substr (column_value, '[^-]+', 1, 1) as column1,
          regexp_substr (column_value, '[^-]+', 1, 2) as column2      
       FROM TABLE(CAST(rtn AS sys.ODCIVARCHAR2LIST));
    end;
    17  /
    PL/SQL procedure successfully completed.
    Elapsed: 00:00:00.09
    ME_XE?
    ME_XE?print :x
    COLUMN1                        COLUMN2
    1                              begin the ugliness
    2                              end the ugliness
    2 rows selected.
    Elapsed: 00:00:00.11In the above example i 'knew' that a hypen was a safe character to use to break up my data elements (as it would not be found anywhere in the data itself).
    I would strongly encourage you not to implement something like this. I realize it's tempting when you are working in strict environments where it can take a serious battle to get structures like temporary tables or SQL Types created, but that's really the proper approach to be taking.

Maybe you are looking for