Oracle, SELECT IN and PreparedStatement.setArray

I want to execute the following query: SELECT * FROM SOMETABLE WHERE IDFIELD IN (?)
The number of values in the IN list is variable. How can I do this with a prepared statement?
I am aware of the different alternatives:
1) Keep a cache of prepared statement for each sized list seen so far.
2) Keep a cache of prepared statements for different sizes (1, 5, 10, 20) and fill in the left over parameter positions with the copies first value.
They both have the disadvantage that there could be many prepared statements for each query that get used once, and never used again.
I have tried this:
stmt.execute ("CREATE OR REPLACE TYPE LONGINTLIST AS TABLE OF NUMBER(15)");
ArrayDescriptor desc = ArrayDescriptor.createDescriptor ("LONGINTLIST", conn);
long idValues [] = {2, 3, 4};
oracle.sql.ARRAY paramArray = new oracle.sql.ARRAY (desc, conn, idValues);
PreparedStatement query = conn.prepareStatement ("SELECT * FROM MYTABLE WHERE ID_FIELD IN (?)");
query.setArray (1, paramArray);
But Oracle gives a data conversion error.
I then tried this:
PreparedStatement query = conn.prepareStatement ("SELECT * FROM MYTABLE WHERE ID_FIELD IN (SELECT * FROM TABLE (?))");
This works and the rows are returned, but the Oracle optimizer does not like it very much, since it always does a full table scan even though there is a primary key index on ID_FIELD.
Any ideas?
I also tried this:
OraclePreparedStatement oraQuery = (OraclePreparedStatement) query;
oraQuery.setARRAY (1, paramArray);
But same behavior.
Roger Hernandez

Please re-read the original message. As I mentioned,
I am aware of the two commonly used alternatives.No actually the most used alternative is to build the SQL dynamically each time.
I know how to get both of them to work, and have used
both alternatives in the past. The downside to both
these approaches is that you need to save multiple
prepared statements for each query. What I am trying
to find is a way of having only one saved prepared
statement for a query having a variable number of IN
clause parameters.You could probably use a stored procedure that takes an 'array' and then do the processing in the stored proc to handle each array element.
However, your database might not support that stored procs or arrays. Or it might not cache it with arrays. And the overhead of creating the array structure or processing it in the proc might eat any savings that you might gain (even presuming there is any savings) by using a prepared statement in the first place. Of course given that you must be using an automated profiling tool and have a loaded test environment you should be able to easily determine if this method saves time or not.
Other than that there are no other solutions.

Similar Messages

  • In oracle rac, If user query a select query and in processing data is fetched but in the duration of fetching the particular node is evicted then how failover to another node internally?

    In oracle rac, If user query a select query and in processing data is fetched but in the duration of fetching the particular node is evicted then how failover to another node internally?

    The query is re-issued as a flashback query and the client process can continue to fetch from the cursor. This is described in the Net Services Administrators Guide, the section on Transparent Application Failover.

  • Difference in select for update of - in Oracle Database 10g and 11g

    Hi, I found out that Oracle Database 10g and 11g treat the following PL/SQL block differently (I am using scott schema for convenience):
    DECLARE
      v_ename bonus.ename%TYPE;
    BEGIN
      SELECT b.ename
        INTO v_ename
        FROM bonus b
        JOIN emp e ON b.ename = e.ename
        JOIN dept d ON d.deptno = e.deptno
       WHERE b.ename = 'Scott'
         FOR UPDATE OF b.ename;
    END;
    /While in 10g (10.2) this code ends successfully (well NO_DATA_FOUND exception is raised but that is expected), in 11g (11.2) it raises exception "column ambiguously defined". And that is definitely not expected. It seems like it does not take into account table alias because I found out that when I change the column in FOR UPDATE OF e.empno (also does not work) to e.mgr (which is unique) it starts working. So is this some error in 11g? Any thoughts?
    Edited by: Libor Nenadál on 29.4.2010 21:46
    It seems that my question was answered here - http://stackoverflow.com/questions/2736426/difference-in-select-for-update-of-in-oracle-database-10g-and-11g

    The behaviour seems like it really is a bug and can be avoided using non-ANSI syntax. (It makes me wonder why Oracle maintains two query languages while dumb me thinks that this is just a preprocessor matter and query engine could be the same).

  • Oracle SELECT and storage technique

    Hi,
    I have 2 questions please. First of all, what kind of storage mechanism is used in Oracle e.g Oracle 11g, is it HEAP BASED or some other?
    Actually I am not able to search how Oracle stores the data into tables as I've heard that heap based storage is a mechanism in which the data is saved in the same order as it is being inserted?
    What is the Linear Search?
    I've performed test on more than 40 tables with simple SELECT and Elapsed time is always favoring 16k block size when compared to 4k and 8k data block size.
    Just thinking the reason that why SELECT is favoring 16k in all the tests, because the data is saved in hundreds and thousands of data blocks and if it is in the smaller data block, it has to go and search more and more data blocks, is it true?
    Please help me with your expert opinions and if possible please suggest me some book or paper which explains the ORACLE STORAGE MECHANISM AND SEARCHING MECHANISM i.e. LINEAR search or what?
    I'll appreciate the suggestions.
    Thanks a lot.
    Best Regards,
    John

    John-M wrote:
    I see you've also re-opened an older question which overlaps with this topic - so I'll be making some comments there as well: Re: single col v/s multi col table elapsed time comparison
    I have 2 questions please. First of all, what kind of storage mechanism is used in Oracle e.g Oracle 11g, is it HEAP BASED or some other?
    The most commonly used mechanism is heap-based - rows are put wherever the next convenient space happens to be.
    Actually I am not able to search how Oracle stores the data into tables as I've heard that heap based storage is a mechanism in which the data is saved in the same order as it is being inserted?
    Not quite - but see other post.
    What is the Linear Search? Depends how technical you want to be - the implication is that you "start at the beginning, work through to the end and then stop". The search it linear because the time it takes to complete it proportional with the volume of data available.
    >
    Please help me with your expert opinions and if possible please suggest me some book or paper which explains the ORACLE STORAGE MECHANISM AND SEARCHING MECHANISM i.e. LINEAR search or what?
    The Concepts manual is pretty good on storage.
    Regards
    Jonathan Lewis

  • Multiple selection list and passing that value to oracle reports

    Hi
    I need to create a multiple selection list and then based on use selection, I need to pass that value to oracle reports. Can any one help with steps on how I can do this. Thanks

    Hi
    Concatenate the multiple values into a string separated by comma and then pass that string to report as a parameter.
    In report query, you have to use the lexical parameter using ' & '
    regards
    SD

  • PreparedStatement.setArray() ... again

    Hi Joe;
    I am aware that weblogic pool driver does not support Oracle Array's
    via .setArray. This is because Oracle Array's require
    ArrayDescriptor, and when I call this class with a Weblogic Pool
    Connection, a ClassCastException is thrown because the Connection
    object is not an OracleConnection.
    Is there anyway I can use PreparedStatement.setArray() without
    getting this ClassCastException? Are there any known workarounds that
    prevents me from having to use Oracle Specific classes?
    I am using WLS 6.1sp4 on Oracle 9i
    Thanks,
    [email protected]

    Paul Rowe wrote:
    Hi Joe;
    I am aware that weblogic pool driver does not support Oracle Array's
    via .setArray. This is because Oracle Array's require
    ArrayDescriptor, and when I call this class with a Weblogic Pool
    Connection, a ClassCastException is thrown because the Connection
    object is not an OracleConnection.
    Is there anyway I can use PreparedStatement.setArray() without
    getting this ClassCastException? Are there any known workarounds that
    prevents me from having to use Oracle Specific classes?
    I am using WLS 6.1sp4 on Oracle 9iHi. In 6.1sp5 we implement a method on pool connections, getVendorConnection(),
    which for those intractible cases where Oracle secretly requires a specific class
    (it's secret because the method signatues says it takes a java.sql.Connection),
    we provide a way to get a direct reference to the pooled oracle connection.
    This is dangerous, because it gives application code a backdoor to the pooled
    resource, and we can never again guarantee that future pool users are getting
    sole access to the connection. Therefore, by default we will close and replace
    any pooled connection after it is exposed in this way. Read the docs on this option,
    and I can give advice too on the safe things to do with an exposed connection,
    and later, how to retrieve the performance lost to the pool having to replace
    exposed connections....
    Joe
    >
    >
    Thanks,
    [email protected]

  • Logical operators in Oracle select query

    Hello all,
    Can i use logical operators in oracle select queries?
    for 1 and 0 =0 ; 1 or 0 =0
    if i have two fileds in a table COL1 have a value of 1010 and COL2 have a value of 0001.
    Is there any way to use select col1 or col2 from table? where or is a logical operator?
    Regards,

    Hi,
    NB wrote:
    Hello all,
    Can i use logical operators in oracle select queries?Sure; Oracle has the logical operators AND, NOT and OR. All the comparison operators, including >, >=, = !=, EXISTS, IN, IS NULL, LIKE and REGEXP_LIKE are really logical operators, since they return logical values. You can use them in SELECT statements, and other places, too.
    for 1 and 0 =0 ; 1 or 0 =0
    if i have two fileds in a table COL1 have a value of 1010 and COL2 have a value of 0001.It's unclear what you want. Maybe you'd be interested in the BITAND function:
    http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions014.htm#sthref1080
    BITAND is the only logical function that I know of. Many other functions, especially numberical fucntions such as MOD, have applications in logic.
    Is there any way to use select col1 or col2 from table? where or is a logical operator?Whenever you have a question, please post a little sample data (CREATE TABLE and INSERT statements), and also post the results you want from that data.
    Explain how you get those results from that data.
    Always say which version of Oracle you're using.

  • Oracle Data Profiling and Data Quality

    Hi,
    How to create metabase for Oracle Data Profiling and Data Quality.Is metabase and repository are same.

    Hi,
    You can create a metabase in the Metabase Manager:
    - Expand Control Admin
    - Click on Metabases
    - in the Metabases window, right-click on the white area and select Add...
    - go through the wizard to create your metabase
    This is documented in the ODQ/ODP tutorial (http://www.oracle.com/technology/products/oracle-data-quality/pdf/oracledq_tutorial.pdf) and in the Documentation (in Metabase Manager or Oracle Data Quality go to Help and then Manuals).
    Thanks,
    Julien

  • Report with select list and link to call another report

    Hi,
    I am trying to do 2 reports (REPORT1 and REPORT2).
    The first is a summary report (REPORT1).
    This report will display sales figures for the year. Now, I need to have a select list in the result set that will have 2 options, depending on which option is chosen, I want to call REPORT2 with the select list as a parameter. How can I do this ?
    Let me try to explain what I did.
    I created REPORT1 on Page 100
    SELECT YEAR, sum(YTD_SALES), APEX_ITEM.SELECT_LIST(1,'DEPARTMENT','Department;DEPARTMENT,Division;DIVISION') Drilldown FROM SALES_ANALYSIS WHERE YEAR > 2000
    GROUP BY YEAR ORDER BY YEAR
    I created 2 hidden items namely P100_YEAR and P100_DRILLDOWN
    I also made the column YEAR as a link and specified both P100_YEAR and P100_DRILLDOWN as parameters to be passed.
    Next, I created REPORT2
    SELECT YEAR, DECODE(:P100_DRILLDOWN, 'Department', department, 'Division', Division) dept_div, sum(YTD_SALES) ytd_sales
    FROM SALES_ANALYSIS
    WHERE YEAR = :P100_YEAR
    When I run Report 1, it's fine, when I choose either Department or Division from the Select List and click on the link to call Report 2, report 2 is displayed, but the value being passed for P100_DRILLDOWN is not correct and as a result, I am unable to get correct results for Report 2
    Am I missing something ? Are there any alternate ways to do what I'm doing ?
    Thanks,
    Ashok

    Hi Ashok,
    The link definition will not know the value selected in the list as it is constructed only when the page is being rendered. You would need to create some javascript to handle this. I've done that here: [http://apex.oracle.com/pls/otn/f?p=267:182]
    The link on the EMPNO column has been defined in the HTML Expression setting for the column instead of the Link section. The HTML Expression that I have used is:
    <a href="#" onclick="javascript:doDrilldown('#EMPNO#',this);">#EMPNO#</a>And, in the page's HTML Header setting, I have added in:
    <script type="text/javascript">
    function doDrilldown(empno,group)
    var g;
    var p = group.parentNode;
    while (p.tagName != "TR")
      p = p.parentNode;
    var x = p.getElementsByTagName("SELECT");
    if (x.length > 0)
      g = x[0].value;
    var url = "f?p=&APP_ID.:183:&SESSION.::::P183_EMPNO,P183_GROUP:" + empno + "," + g;
    document.location.href = url;
    </script>When a link is clicked, the doDrilldown function is called passing in the EMPNO value and the "this" object (which identifies the object triggering the call). The function starts from that object and goes up in the HTML tag tree to the nearest TR tag (the row tag that the link is on) and then finds the first SELECT list item on the row and gets its value. It then constructs a URL using this and the EMPNO value and performs a redirect to the second page (page 183 in this example).
    Andy

  • Different Results from SQL-Query in Oracle 10.2 and  Oracle 11.2

    Look at the following example:
    CREATE TABLE GZP_PLAN (GZP_ID
    NUMBER(9) NOT NULL, PARENT_GZP_ID NUMBER(9),
    CONSTRAINT GZP_PLAN_PK1 PRIMARY KEY(GZP_ID)
    USING INDEX
    TABLESPACE USERS
    TABLESPACE USERS;
    insert into GZP_PLAN values(1,NULL);
    CREATE TABLE GZP_WB (OBJECTID NUMBER
    NOT NULL, GZP_ID NUMBER(10),
    CONSTRAINT GZP_WB_PK1_1 PRIMARY KEY(OBJECTID)
    USING INDEX
    TABLESPACE USERS
    TABLESPACE USERS;
    insert into GZP_WB values(1,1);
    CREATE OR REPLACE VIEW VW_GZP (GZP_ID1) AS
    SELECT xxx.gzp_id
    FROM gzp_plan xxx
    WHERE gzp_id IN (
    SELECT MAX (z.gzp_id) zzz
    FROM gzp_plan z
    START WITH z.gzp_id = xxx.gzp_id
    CONNECT BY PRIOR gzp_id = parent_gzp_id);
    -- query
    select a.* from GZP_WB a where gzp_id in (select gzp_id1 from vw_gzp);
    Result in Oracle 10.2. (Windows Server 2003 32-bit, Oracle 10.2.0.2 or Oracle 10.2.0.5, Enterprise Edition)
    OBJECTID     GZP_ID
    *1 1*
    Result in Oracle 11.2 (Windows Server 2008 64-bit, Oralcle 11.2.0.2, Enterprise Edition or Standard Edition One)
    no rows selected
    The result of the following queries are identical in Oracle 10.2 and 11.2
    SQL> select * from GZP_WB where to_char(gzp_id) in
    2 (select to_char(gzp_id1) from vw_gzp);
    OBJECTID GZP_ID
    1 1
    SQL>
    SQL> select a.* from GZP_WB a, vw_gzp b where a.gzp_id=b.gzp_id1;
    OBJECTID GZP_ID
    1 1

    The solution is Oracle 11.2.0.3 - patchset released 11th November.

  • Select expert and dates

    Post Author: barflyz
    CA Forum: Crystal Reports
    Hi, I am using Crystal 11. I connect to Oracle. My report pulls a date field which displays correctly and can be formatted. However, when I use the select expert and select "equal to", the drop down list does nor display the correct dates stored in this field. Any idea on how to solve this issue? thanks!

    Post Author: SKodidine
    CA Forum: Crystal Reports
    Some sample data might prove useful in understanding what exactly is happening.  Barring that, have you tried clicking on 'Show Formula' in the select expert and then just typing in the date instead of choosing it from the drop down list?

  • Oracle.sql.BLOB and oracle.sql.STRUCT

    I'm development a application in Java with oracle, to manage media files. When I try to insert into oracle , I have this problem "oracle.sql.BLOB cannot be cast to oracle.sql.STRUCT" , and I don't know what that can be ..
    This is my code , please help with that.. If you have a smaple code of java and oracle to insert media , that will be a great help ..
    public void loadDataFromStream(OracleConnection con)
    try {
    Statement s = con.createStatement();
    OracleResultSet rs = (OracleResultSet)
    s.executeQuery("select * from blobs where id='video2.avi' for update ");
    String index = "";
    while(rs.next())
    index = rs.getString(1);
    index+="1";
    System.out.println("llego hasta aki");
    // el error esta en esta linea de abajo ...
    OrdVideo vidObj = (OrdVideo) rs.getCustomDatum(2, OrdVideo.getFactory());
    //rs.getBfile(3);///
    FileInputStream fStream = new FileInputStream("/home/jova/movie.avi");
    vidObj.loadDataFromInputStream(fStream);
    vidObj.getDataInFile("/home/jova/movie.avi");
    fStream.close();
    System.out.println(" getContentLength output : " +
    vidObj.getContentLength());
    OraclePreparedStatement stmt1 =
    (OraclePreparedStatement) con.prepareCall("update blob_col set image = ? where id = " + index);
    stmt1.setCustomDatum(1,vidObj);
    stmt1.execute();
    stmt1.close() ;
    index+="1";
    System.out.println("OK");
    catch(Exception e) {
    System.out.println("exception raised " + e);
    System.out.println("load data from stream unsuccessful");
    }

    I'm development a application in Java with oracle, to manage media files. When I try to insert into oracle , I have this problem "oracle.sql.BLOB cannot be cast to oracle.sql.STRUCT" , and I don't know what that can be ..
    This is my code , please help with that.. If you have a smaple code of java and oracle to insert media , that will be a great help ..
    public void loadDataFromStream(OracleConnection con)
    try {
    Statement s = con.createStatement();
    OracleResultSet rs = (OracleResultSet)
    s.executeQuery("select * from blobs where id='video2.avi' for update ");
    String index = "";
    while(rs.next())
    index = rs.getString(1);
    index+="1";
    System.out.println("llego hasta aki");
    // el error esta en esta linea de abajo ...
    OrdVideo vidObj = (OrdVideo) rs.getCustomDatum(2, OrdVideo.getFactory());
    //rs.getBfile(3);///
    FileInputStream fStream = new FileInputStream("/home/jova/movie.avi");
    vidObj.loadDataFromInputStream(fStream);
    vidObj.getDataInFile("/home/jova/movie.avi");
    fStream.close();
    System.out.println(" getContentLength output : " +
    vidObj.getContentLength());
    OraclePreparedStatement stmt1 =
    (OraclePreparedStatement) con.prepareCall("update blob_col set image = ? where id = " + index);
    stmt1.setCustomDatum(1,vidObj);
    stmt1.execute();
    stmt1.close() ;
    index+="1";
    System.out.println("OK");
    catch(Exception e) {
    System.out.println("exception raised " + e);
    System.out.println("load data from stream unsuccessful");
    }

  • "select count(*)" and "select single *" returns different result

    Good day!
    product version SAP ECC 6.0
    oracle10
    data transfers from external oracle db into customer tables using direct oracle db link
    sometimes I get case with different results from 2 statements
    *mytable has 10 rows
    *1st statement
    data: cnt type I value 0.
    select count( * ) into cnt from mytable WHERE myfield_0 = 123 and myfield_1 = '123'.
    *cnt returns 10 - correct
    *2nd statement
    select single * from  mytable WHERE myfield_0 = 123 and myfield_1 = '123'.
    *sy-dbcnt returns 0
    *sy-subrc returns 4 - incorrect, 10 rows are "invisible"
    but
    1. se16 shows correct row number
    2. I update just one row from "invisible" rows using se16 and 2nd statement returns correct result after that
    can not understand why
    thank you in advance.

    Thank you, Vishal
    but,
    general problem is that
    1. both statements have the same WHERE conditions
    2. 1st return resultset with data (sy-dbcnt=10), 2nd return empty dataset, but must return 1 in sy-dbcnt
    Yes, different meaning, you are right, but must 2nd must return 1, because of "select single *" construction, not 0.
    Dataset to process is the same, WHERE conditions are equal...
    I think the problem is that how ABAP interperets select count(*) and "select single *".
    Maybe "select count (*)" scans only PK from index page(s)? and "select single *" scans data pages? and something is wrong with that?
    I'm new in SAP and didn't find any SAP tool to trace dump of data and indexes pages with Native SQL.
    se16 shows all records.
    And why after simple manual update of just one record using se16 "select single *" returns 1?
    I've just marked one row to update, didn't change any data, then pressed "save".

  • Select Distinct and join in ODI

    Hi,
    I have following task to perform: I am loading metadata into Planning dimension from Oracle database. I have two tables
    1. "Sales"
    Columns: Name, Number, Value
    Sample Data:
    Product 1, 10, 200
    Product 2, 30, 100,
    Product 1, 15, 500
    2. P&R
    Columns:
    Name, Alias
    Product 1, SampleSoda1
    Product 2, SampleSoda2,
    Resource 1, CanForSoda,
    Resource 2, CO2
    What I need to do is: I have to select name and alias from second table of all products that were sold.
    So I need to select distinct Name from Table 1, naxt join it with Table 2 (so I have Name and Alias) and load it to planning.
    I am a little confused how to do it.
    Any help would be great!
    Best regards,
    Greg

    Hi Greg,
    What you can do is either :
    - Create a yellow interface with your table Sales as source. Map the name column directly in the target. In the flow tab, click on your target and select "Distinct rows".
    - Create a second interface, with your first interface as source. Select the "Use Temporary Interface as Derived Table (Sub-Select)" checkbox.
    - Add your second datastore and join it. Or you can use a lookup table.
    OR
    - Create an interface with Sales and P&R as source (or set P&R as a lookup table).
    - Go on the flow tab and select "Distinct rows".
    If you've a lot a data in the first table, I would go for the first solution.
    Hope it helps.
    Regards,
    JeromeFr
    Edited by: JeromeFr on Feb 14, 2013 9:52 AM
    To be more clear in the first step of solution 1

  • Differences between  Oracle Discoverer 10g and 11g (EBS & Desktop)

    We are in the process of upgrading from Oracle Discoverer 10g testing to Oracle Discoverer 11g.
    We have had several requests (from functional users) for documentation that might reflect the changes in this release level. Does anyone have relevant documentation that might help explain what has changed so that they can be better prepared.

    We are in the process of going from 10 desktop to 11 plus. I do not like it as other end-users I have talked to don't either. In desktop, I could have multiple reports open at one time, move tabs from one report to another so I wouldn't have to rebuild the report again. Also, there are times I have 3 or more sessions of desktop running with multiple reports running in them. In plus, I am limited to one session and one report. That slows down productivity big time. In desktop, exporting crosstabs to excel is more user friendly than plus. For desktop, it will fill in the cells below with the data above it if it changes. In plus, it looks like a pivot table. I have read other posts on how to work around that, but not always functional. Using Dense_Rank() works sometimes depending on how the report is written. IT is researching another way but haven't heard back from the consultants. Or, I will have to modify all my excel files with formulas to do that for me. Also in desktop, I can select all and copy paste the results into excel and all data comes in. The row and column headers, page items and even the title section will paste into excel. Plus only gives you the data, no row or column headers. So I have to export it every time I need the data. I have formatted excel files that all I need to do is copy paste and data flows beautifully. As for organizing and saving reports, desktop is much better. I can save reports out on our network under different folders so I can find them faster by topic. Granted, if that directory is an open one, anyone can change/delete it. In plus, the only advantage of saving it on the database is I can sort and search for reports or users. If you make any changes in plus and then walk away from your desk, plus will shut down after a certain time period. If you didn't save it, you have to start over. Don't know if this is something IT can fix???
    As we see it, plus is a step back in technology. I hope someone can change that opinion. Don't know if we are not getting the best support from whoever is working with us (Oracle or 3rd party) or we are missing something???? If so, please share.
    Thanks.

Maybe you are looking for

  • How to color a text(font) in GRID?

    hii..can i color a <b>tex</b>t(not cell using slis_layout_alv-info_fieldname) in GRID display..if so please give me an idea or  sample code... thanks in advance..

  • Size-to-Fit problem, Planning 9.3.1

    I'm having a problem with a new install of Planning 9.3.1 (with Patch 1). When I select "Size-to-Fit" from the options for column size, it doesn't work. The columns don't resize themselves to fit the data, and I can not resize them by dragging the mo

  • RMI connectivity problem (multi-NIC)

    I'm developing a simple photo share program with Java RMI. I connect rmiregistry (192.168.100.3), it returns the object reference, but when I invoke a method I get problems. My server (remote) - 192.168.100.3 - reply with an address of another NIC -

  • Favorite glyphs in Character Palette

    In Panther, I was able to put frequently used special glyphs like © into the Favorites panel of Character Palette so that I did not have to hunt for them all over Unicode space. In Tiger, the Favorites panel still shows up in Character Palette, but t

  • What to download to learn SAP Netweaver?

    Hello, I am new to SAP Netweaver, and SAP in general. I am learning to be a SAP BASIS admin. I am curious to know what downloads are available from which I can install on my PC and go about learning. Thank you in advance for your help.