Xml bulk insert in oracle table - sql

Im new to oracle,
what im trying is,
I have an xml, i try to insert the same in a oracle database table, i have formed a query, when i try to insert it. i get some Error like
Error report -
ORA-06550: line 35, column 84:
PL/SQL: ORA-00933: SQL command not properly ended
ORA-06550: line 5, column 2:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
i couldnt able to figure out what i missed, Suggest me how to change the query,
heres my XML and Query which im trying to work.
- <call>
- <callSummary>
<indId>100</indId>
<notificationNo>notification</notificationNo>
<orderNo>orderno</orderNo>
</callSummary>
- <callList>
- <callDetails>
<maintenancetype>1</maintenancetype>
<serialNo>1</serialNo>
<unitType>unit type</unitType>
</callDetails>
- <callDetails>
<maintenancetype>1</maintenancetype>
<serialNo>2</serialNo>
<unitType>unit type</unitType>
</callDetails>
- <callDetails>
<maintenancetype>2</maintenancetype>
<serialNo>1</serialNo>
<unitType>unit type</unitType>
</callDetails>
- <callDetails>
<maintenancetype>2</maintenancetype>
<serialNo>2</serialNo>
<unitType>unit type</unitType>
</callDetails>
</callList>
</call>
my Query is
DECLARE
call_xml XMLTYPE := xmltype('<call><callSummary><indId>100</indId><notificationNo>notification</notificationNo><orderNo>orderno</orderNo><</callSummary><callList><callDetails><maintenancetype>1</maintenancetype><serialNo>1</serialNo><unitType>unit type</unitType></callDetails><callDetails><maintenancetype>1</maintenancetype><serialNo>2</serialNo><unitType>unit type</unitType></callDetails><callDetails><maintenancetype>2</maintenancetype><serialNo>1</serialNo><unitType>unit type</unitType></callDetails><callDetails><maintenancetype>2</maintenancetype><serialNo>2</serialNo><unitType>unit type</unitType></callDetails></callList></call>');
BEGIN
INSERT INTO ORDER_DETAILS (
IND_ID,NOTIFICATION_NO,ORDER_NO,MAINT_TYPE,SERIAL_NO,UNIT_TYPE)
SELECT
call_xml.value('call/callSummary/indId[1]','CLNT(3)'),
call_xml.value('call/callSummary/notificationNo[1]','CHAR(12)'),
call_xml.value('call/callSummary/orderNo[1]','CHAR(12)'),
call_xml.value('call/callSummary/callList/callDetails/maintenancetype[1]','CHAR(1)'),
call_xml.value('call/callSummary/callList/callDetails/serialNo[1]','CHAR(1)'),
call_xml.value('call/callSummary/callList/callDetails/unitType[1]','CHAR(20)') from call_xml.nodes('call');
END;
I hope you understand my question, Thanx in advance.

You'll want to use the xmlsequence function. It will allow you to select a list of nodes from your XML object. If you'd like to use pl/sql, the replace xmltype, with your variable.
SELECT
extractValue(column_value,'callSummary/indId[1]'),
extractValue(column_value,'callSummary/notificationNo[1]'),
extractValue(column_value,'callSummary/orderNo[1]'),
extractValue(column_value,'callSummary/callList/callDetails/maintenancetype[1]'),
extractValue(column_value,'callSummary/callList/callDetails/serialNo[1]'),
extractValue(column_value,'callSummary/callList/callDetails/unitType[1]') from table (
xmlsequence(
extract(
xmltype('<call><callSummary><indId>100</indId><notificationNo>notification</notificationNo><orderNo>orderno</orderNo></callSummary><callList><callDetails><maintenancetype>1</maintenancetype><serialNo>1</serialNo><unitType>unit type</unitType></callDetails><callDetails><maintenancetype>1</maintenancetype><serialNo>2</serialNo><unitType>unit type</unitType></callDetails><callDetails><maintenancetype>2</maintenancetype><serialNo>1</serialNo><unitType>unit type</unitType></callDetails><callDetails><maintenancetype>2</maintenancetype><serialNo>2</serialNo><unitType>unit type</unitType></callDetails></callList></call>'),'/call/callSummary')));

Related

Wrong number or types of arguments error using cursors with parameters

I am getting this error trying to have an input parameter "var_city" in my cursor so I can use the user's input of a city.
Error report -
ORA-06550: line 17, column 5:
PLS-00306: wrong number or types of arguments in call to 'CUSTOMERS'
ORA-06550: line 17, column 5:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
p_city is commented out because I was trying to use that input parameter as the value used but it didn't work as well.
SET SERVEROUTPUT ON
SET VER OFF
-- ACCEPT p_city PROMPT 'Enter city name: '
DECLARE
v_custname si.customer.custname%TYPE;
v_total_spent NUMBER;
v_total_cars NUMBER;
CURSOR customers (var_city varchar2) IS
SELECT
custname
FROM
si.customer
WHERE
UPPER(custcity) = UPPER(var_city);
BEGIN
dbms_output.put_line('Customer Name'
|| 'Total Cars'
|| 'Total Spent');
OPEN customers;
LOOP
FETCH customers INTO v_custname;
EXIT WHEN customers%NOTFOUND;
cust_total_spending_and_cars(v_custname, v_total_cars, v_total_spent);
dbms_output.put_line(v_custname
|| v_total_cars
|| v_total_spent);
END LOOP;
CLOSE customers;
END;
/
An argument must be passed to the OPEN statement
Change this line:
OPEN customers;
To something like this:
OPEN customers('city name here');

XMLQuery with Oracle

I'm doing examples from workbook. I created table and insert couple of records. Below is my code:
Create table:
CREATE TABLE test_Pracownicy
(IDPracownika NUMBER(3),
Dane XMLTYPE);
Insert record to the table:
INSERT INTO test_Pracownicy (IDPracownika, Dane)
VALUES (1,
XMLTYPE('
<PRecord>
<Nazwisko>Kowalski</Nazwisko>
<Imie>Jan</Imie>
<RokUrodz>1980</RokUrodz>
<Wzrost>1.77</Wzrost>
<DataZatr>2001/02/10</DataZatr>
</PRecord>')
);
Now I want to run XMLQuery:
SELECT IDPracownika,
XMLQuery(
'FOR $i IN /PRecord
WHERE $i /Nazwisko = "Kowalski"
ORDER BY $i/Imie
RETURN $i'
PASSING by VALUE Dane
RETURNING CONTENT) NazwiskoXML
FROM test_Pracownicy;
and I'm getting error:
ORA-19114: XPST0003 - error during parsing the XQuery expression:
LPX-00801: XQuery syntax error at 'i'
1 FOR $i IN /PRecord
- ^
19114. 00000 - "error during parsing the XQuery expression: %s"
*Cause: An error occurred during the parsing of the XQuery expression.
*Action: Check the detailed error message for the possible causes.
Error at Line: 117 Column: 6
I changed query to small (for, where, return...) letters and it's workging:
SELECT IDPracownika,
XMLQuery(
'for $i in /PRecord
where$i /Nazwisko = "Kowalski"
order by $i /Imie
retrun $i'
PASSING by VALUE Dane
RETURNING CONTENT) NazwiskoXML
FROM test_Pracownicy;
It's case sensitive.

retrieve information using a composite variable

I am trying to retrieve information using a composite variable with the following lines, but it is not working. The error report is further below, and the suppose output is at the bottom. I thank you in advance for any advise.
set serveroutput on
DECLARE
TYPE type_shopper IS RECORD(
shopperid bb_shopper.idshopper%TYPE,
firstname bb_shopper.firstname%TYPE,
lastname bb_shopper.lastname%TYPE,
email bb_shopper.email%TYPE);
rec_shopper type_shopper;
lv_days_num NUMBER(1);
lv_shopper_num NUMBER(3) :=30;
BEGIN
SELECT idshopper, firstname, lastname, email
INTO rec_shopper
FROM bb_shopper
WHERE idshopper = lv_shopper_num
lv_days_num := SYSDATE - rec_shopper.created;
lv_days_num := SYSDATE - rec_shopper.created;
DBMS_OUTPUT.PUT_LINE(rec_shopper.firstname);
DBMS_OUTPUT.PUT_LINE(rec_shopper.lastname);
DBMS_OUTPUT.PUT_LINE(rec_shopper.email);
END;
/
The error report is the following.
Error report -
ORA-06550: line 15, column 3:
PL/SQL: ORA-00933: SQL command not properly ended
ORA-06550: line 11, column 3:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
This is suppose to be the output.
Shopper ID: 37
First Name: John
Last Name: Doe
Became shopper 1 days ago

Alias required in SELECT list of cursor to avoid duplicate column names

I am having an issue doing a plsql command. The idea is to show the courier, location, and yes or not if it is over 20.
DECLARE
yesnobool VARCHAR(3);
CURSOR orders_list IS
SELECT shipping.ship_courier,
shipping.weightpership,
shipping.shipping#,
purchaseorder.shipping#,
storelocation.location#,
STORELOCATION.LOC_CITY,
purchaseorder.location#
FROM shipping,
purchaseorder,
storelocation
WHERE purchaseorder.shipping# = shipping.shipping#
and storelocation.location# = purchaseorder.location#;
BEGIN
dbms_output.Put_line('Courier || Location || Too Heavy for 1 person lift?');
dbms_output.Put_line('------ -------- -----------------------------------');
FOR an_order IN orders_list LOOP
IF SHIPPING.WEIGHTPERSHIP > 20 THEN
yesnobool := 'YES';
ELSE
yesnobool := 'NO';
END IF;
dbms_output.Put_line(Rpad(an_order.ship_courier, 6) || ' ' ||
Rpad(an_order.loc_city, 8) || ' ' ||
Rpad(yesnobool, 19));
END LOOP;
END;
The Error message i am getting is:
Error report -
ORA-06550: line 21, column 2:
PLS-00402: alias required in SELECT list of cursor to avoid duplicate column names
ORA-06550: line 21, column 2:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Im not very good with plsql so i dont really know how to pin down the issue. Thank you in advance for any and all advice.
Columns shipping# and location# are duplicated in your select field list.
shipping.shipping#
purchaseorder.shipping#
storelocation.location#,
purchaseorder.location#
The cursor is unable to distinguish which shipping or location its supposed to use.
The solution is to alias the fields. Something like this:
shipping.shipping# as shipping,
purchaseorder.shipping# as poshipping
And:
storelocation.location# as storeLocation,
purchaseorder.location# as poLocation

Issue with dynamic execute immediate query

I have a code in my procedure that looks like this. But when i execute this code, i get the error as mentioned below.
The Error report that i got is:
Error report -
ORA-06553: PLS-306: wrong number or types of arguments in call to 'OGC_Y'
ORA-06512: at line 20
06553. 00000 - "PLS-%s: %s"
*Cause:
*Action:
The error has something to do with primary_flag = "Y" <-- this. How else can i write primary_flag = 'Y' inside a string?
The dynamic query is required in my case.
MY CODE IS:
DECLARE
p_assignee_id NUMBER := 10153;
time_stamp timestamp := '12-DEC-2011';
create_task_view_sql VARCHAR2(4000);
BEGIN
create_task_view_sql:=
'select unique cp.sub_last_name
from cs_sr_contact_points_v cp
where cp.incident_id = 55500
and cp.contact_phone is not null
and primary_flag = "Y"';
dbms_output.put_line(create_task_view_sql);
execute immediate create_task_view_sql;
END;
To embed quoted string in a quoted string, use two single quotes:
'...and primary_flag=''Y''';
Or you can use the newer q' syntax to avoid doubling up the embedded quotes:
q'[...and primary_flag='Y']';