SQL unicode to XML using XMLForest
I'm using XMLForest to retrieve some data from the db. One of the columns has unicode characters such as "Ă". I use XMLForest to read in this data, but the result turns this Ă into a "?". How do I keep the unicode format? I need to output this xml to html using an xsl sheet, and the xsl sheet just converts the "?" as is.
Example:
table with firstnames, and lastnames
firstname lastname
Ăbram Smîth
I use XMLForest as:
SELECT XMLForest (table.firstname, table.lastname);
The result returns as:
<firstname>?bram</firstname><lastname>Sm?th</lastname>
So my xsl sheet returns the xml as just
?bram Sm?th
Is there a method I can follow such that I know what unicode characters are being used?
fyi: this is to run in a java application using Oracle JDBC. I use the following to get the XML string from the XMLType. This is after executing the query using an OraclePreparedStatement and putting the result into an OracleResultSet (ors).
StringBuilder builder = new StringBuilder();
oracle.xdb.XMLType xml = XMLType.createXML(ors.getOPAQUE(1));
builder.append(xml.getStringVal()+"\n");
xml.close();
System.out.println(builder.toString());
There is a slight work-around to this, but I wouldn't highly recommend it. Its just something that I was able to use, since our comany's database is using US7ASCII.
ASCIISTR will return the ASCII of the query result. When there is ascii that is not in the standard ASCII such as 죡, the character is replaced by its unicode value such as, "\C8E1". I parse the xml query result that is returned, for the character "\". Then using Java:
int i = queryResult.indexOf("\\");// i = the index of "\"
//there's usually 4 characters in the unicode, so i+1 to i+5.
String unicode = queryResult.substring(i+1,i+5);
int con = Integer.parseInt(unicode, 16);
char c = (char) con;
queryResult.replace(i, i+5, ""+c);//replace the ascii with actual character.
I replace the "\C8E1" in the query result with char c.
For the example that is provided, the query would be:
SELECT XMLElement("Row", XMLForest(ASCIISTR(data_value))) FROM test;
The result would return as:
<Row><DATA_VALUE>Abram Sm\00EEth</DATA_VALUE></Row>
the \00EE would be replaced with î.
Just an idea, if anyone else is in the same situation.
Similar Messages
-
Urgent help needed for XML Tags using XMLForest()
Folks
I need some urgent help regarding getting use defined tag in your
XML output.
For this I am using XMLElement and XMLForest which seems to work fine
when used at the SQL prompt but when used in a procedure throws and error
SQL> Select SYS_XMLAGG(XMLElement("SDI",
XMLForest(sdi_num)))
From sdi
where sdi_num = 22261;- WORKS FINE
But when used in a procedure,doesnt seem to work
Declare
queryCtx DBMS_XMLQuery.ctxType;
v_xml VARCHAR2(32767);
v_xmlClob CLOB;
BEGIN
v_xml:='Select SYS_XMLAGG(XMLElement("SDI",
XMLFOREST(sdi_num)))
From sdi
where sdi_num = 22261';
queryCtx :=DBMS_XMLQuery.newContext(v_xml);
v_xmlClob :=DBMS_XMLQuery.getXML(queryCtx);
display_xml(v_xmlClob);
End;
CREATE OR REPLACE PROCEDURE display_xml(result IN OUT NOCOPY CLOB)
AS
xmlstr varchar2(32767);
line varchar2(2000);
BEGIN
xmlstr:=dbms_lob.SUBSTR(result,32767);
LOOP
EXIT WHEN xmlstr is null;
line :=substr(xmlstr,1,instr(xmlstr,chr(10))-1);
dbms_output.put_line('.'||line);
xmlstr := substr(xmlstr,instr(xmlstr,chr(10))+1);
END LOOP;
end;
SQL> /
.<?xml version = '1.0'?>
.<ERROR>oracle.xml.sql.OracleXMLSQLException: Character ')' is not allowed in an
XML tag name.</ERROR>
PL/SQL procedure successfully completed.
SQL>HELP is appreciated as to where I am going wrong?Hi,
if you want to transform something to something else, you should declare, what is your source.
I would prefer to use plain XSL-Transformations, because you have a lot more options to transform your source and you can even better determine, how your output should looks like.
Kind regards,
Hendrik -
Generating XML using Varray or Pl/SQL table
I am trying to convert an old plsql procedure to generate XML data. The program is getting all the data to report from various sources to a pl/sql table.
Is there any way to directly convert data into xml from plsql table ??
Here is the plsql table defination
TYPE Emp_rec IS RECORD ( Batch_name VARCHAR2(240)
,Employee_name VARCHAR2(240)
,Employee_number VARCHAR2(240)
,Element_name VARCHAR2(240)
,Bee_value NUMBER
,Ele_scr_value NUMBER
TYPE emp_data IS TABLE OF Emp_rec
INDEX BY BINARY_INTEGER;
E emp_data;
And i am trying to get xml using following code:
FOR i IN E.FIRST.. E.LAST
LOOP
SELECT
XMLConcat (
XMLELEMENT(
"batch",
XMLFOREST(
E(i).Batch_name AS "Batch_name",
E(i).Employee_number AS "Employee_number",
E(i).Element_name AS "Element_name"
INTO l_xml
FROM dual;
end loop;
I am not sure whether this can actually be done or not. I have option to write the xml file manually to output ; but just wondering whether this method of getting xml is correct or not ? If yes, then how can we use plsql table data and merge it into a single XML file
Please let me know your views and opinions.
Thanks
AnkurI am trying to convert an old plsql procedure to generate XML data. The program is getting all the data to report from various sources to a pl/sql table.
Is there any way to directly convert data into xml from plsql table ??
Here is the plsql table defination
TYPE Emp_rec IS RECORD ( Batch_name VARCHAR2(240)
,Employee_name VARCHAR2(240)
,Employee_number VARCHAR2(240)
,Element_name VARCHAR2(240)
,Bee_value NUMBER
,Ele_scr_value NUMBER
TYPE emp_data IS TABLE OF Emp_rec
INDEX BY BINARY_INTEGER;
E emp_data;
And i am trying to get xml using following code:
FOR i IN E.FIRST.. E.LAST
LOOP
SELECT
XMLConcat (
XMLELEMENT(
"batch",
XMLFOREST(
E(i).Batch_name AS "Batch_name",
E(i).Employee_number AS "Employee_number",
E(i).Element_name AS "Element_name"
INTO l_xml
FROM dual;
end loop;
I am not sure whether this can actually be done or not. I have option to write the xml file manually to output ; but just wondering whether this method of getting xml is correct or not ? If yes, then how can we use plsql table data and merge it into a single XML file
Please let me know your views and opinions.
Thanks
Ankur -
Can we generate the output of SQL Query in XML format ..
Hi Team,
Can we generate an XML doc for an SQL Query.
I've seen in SQL Server 2000.It is generating the output of an SQL Query in xml format.
select * from emp for xml auto
The output looks like
<emp EMPNO="7369" ENAME="SMITH" JOB="CLERK" MGR="7902" HIREDATE="1980-12-17T00:00:00" SAL="2800" DEPTNO="20"/><emp EMPNO="7370" ENAME="SMITH" JOB="CLERK" MGR="7902" HIREDATE="1980-12-17T00:00:00" SAL="2800" DEPTNO="10"/>Just a little bit of short hand.
Get the XML out of your database, via HTTP
Of course the easiest method is just to return an XMLType from a stored procedure and let the calling routine figure out what to do with it. Instead
of that way though, I'll show you how to do it via HTTP. It's all completely built into 10g and is super easy to use.
CREATE OR REPLACE VIEW emps_and_depts AS
SELECT e.employee_id AS "EmployeeId",
e.last_name AS "Name",
e.job_id AS "Job",
e.manager_id AS "Manager",
e.hire_date AS "HireDate",
e.salary AS "Salary",
e.commission_pct AS "Commission",
XMLFOREST (
d.department_id AS "DeptNo",
d.department_name AS "DeptName",
d.location_id AS "Location"
) AS "Dept"
FROM employees e, departments d
WHERE e.department_id = d.department_id
Some people hear web and immediately start salivating about security issues. Let me address that quickly. Just because you have the HTTP and/or
FTP servers running in the database, that does not mean you have a security problem. For one, I would hope your databases are behind a firewall.
Second, with the correct architecture (DMZ, app servers, etc) you can make this data available outside the firewall fairly transparently and third,
just because it's on the web does not mean the data MUST be available on the internet. This is a good way to make your data available on your
intranet. If you are worried about people INSIDE your firewall, that still doesn't preclude web based access. Follow Oracle security guidelines.
Before I show you how to get to your data, let's talk about URLs and URIs. A URL is a Uniform Resource Locater and URI is a Uniform Resource
Identifier. A URL is the way you would identify a document on the net, i.e. http://www.oracle.com is a URL. A URI is a more generic form of a URL.
Oracle supports three types of URI: HTTPURIType - basically a URL (which would be like the URL above), XDURIType - a pointer to an XDB resource
(usually an XML document but can be other objects), and DBURIType - a pointer to database objects.
It's the DBURIType that we're going to concentrate on here. The DBURIType let's us reference database objects using a file/folder paradigm. The
format for a DBURI is /oradb/<schema>/<table>. Oradb is shorthand for the database; it is not the database name or SID. My database is named XE
but I still use oradb in the DBURI. For example, the view we created above is in my XE database, is owned by HR (at least in my case) and is called
EMPS_AND_DEPTS. This can be referenced as /oradb/HR/EMPS_AND_DEPTS.
If the view had many rows and you wanted only one of them, you can restrict it by including a predicate. The documentation for XDB has a great
write up on Using DBURIs.In our case, we are going to write out the entire document. Now that you understand that the DBURI is a pointer to
objects in our instance, we can use that to access the data as a URL.
The format for the URL call is http://<machinename>:<port>/<DBURI>
In my case, my XE database is running on a machine called mach1 and is listening on port 8080. So to see the view we created above, I open my
browser and navigate to: http//mach1:8080/oradb/HR/EMPS_AND_DEPTS
The created URL will be as http//mach1:8080/oradb/PUBLIC/EMPS_AND_DEPTS
If your database is set up correctly and listening on port 8080 (the default), your browser should ask you to login. Login as the user who created the
view (in my case HR). You should now get an XML document displayed in your browser.
And that's it. It doesn't get much simpler than that. If you get rid of the descriptive text above, it basically comes down to:
Create a table or view
Open your web browser
Enter a URL
Enter a user ID and password
View your XML
If you notice, Oracle formatted the data as XML for us. Our view returns scalar columns and an XML fragment called Dept. Oracle formatted the
return results into an XML format.
And as a side note, if you look closely, you'll see that my URL has PUBLIC where I said to put HR. PUBLIC is a synonym for all objects that your
logged in user can see. That way, if your user has been granted select access on many schemas, you can use PUBLIC and see any of them. -
Error using XMLForest(). Please see
Hi,
This is the ERROR encountered using XMLForest().
Declare
queryCtx DBMS_XMLQuery.ctxType;
v_xml VARCHAR2(32767);
v_xmlClob CLOB;
BEGIN
v_xml:='Select SYS_XMLAGG(XMLElement("SDI",
XMLFOREST(sdi_num)))
From sdi
where sdi_num = 22261';
queryCtx :=DBMS_XMLQuery.newContext(v_xml);
v_xmlClob :=DBMS_XMLQuery.getXML(queryCtx);
display_xml(v_xmlClob);
End;
CREATE OR REPLACE PROCEDURE display_xml(result IN OUT NOCOPY CLOB)
AS
xmlstr varchar2(32767);
line varchar2(2000);
BEGIN
xmlstr:=dbms_lob.SUBSTR(result,32767);
LOOP
EXIT WHEN xmlstr is null;
line :=substr(xmlstr,1,instr(xmlstr,chr(10))-1);
dbms_output.put_line('.'||line);
xmlstr := substr(xmlstr,instr(xmlstr,chr(10))+1);
END LOOP;
end;
SQL> /
.<?xml version = '1.0'?>
.<ERROR>oracle.xml.sql.OracleXMLSQLException: Character ')' is not allowed in an
XML tag name.</ERROR>
PL/SQL procedure successfully completed.
SQL>If the the Select is written on the SQL Prompt
it works fine.
Can some one tell me why this is happening?can some one help me please?
The SELECT statement seems to run on the SQL prompt
with XMLForest but not in the PROCEDURE associated
with it.
Am i overlooking anything? -
LIKE operator is not working in SQL Query in XML file
Hi Gurus,
LIKE operator is not working in SQL query in XML template.
I am creating a PDF report in ADF using Jdeveloper10g. The XML template is as follows
<?xml version="1.0" encoding="WINDOWS-1252" ?>
<dataTemplate name="catalogDataTemplate" description="Magazine
Catalog" defaultPackage="" Version="1.0">
<parameters>
<parameter name="id" dataType="number" />
<parameter name="ename" dataType="character" />
</parameters>
<dataQuery>
<sqlStatement name="Q1">
<![CDATA[
SELECT ename, empno, job, mgr from EMP where deptno=:id and ename LIKE :ename || '%']]>
</sqlStatement>
</dataQuery>
<dataStructure>
<group name="EmployeeInfo" source="Q1">
<element name="EmployeeName" value="ename" />
<element name="EMPNO" value="empno" />
<element name="JOB" value="job"/>
<element name="MANAGER" value="mgr" />
</group>
</dataStructure>
</dataTemplate>
if i pass the parameter value of :ename from UI, it doesn't filter. But if I give ename = :ename it retrieves the data. Can anyone help me why LIKE operator doesn't work here?
Appreciate your help,
Shyamal
email: [email protected]Hi
Well for a start, you are doing some very strange conversions there. For example...
and to_char(a.msd, 'MM/DD/YYYY') != '11/11/2030'
and to_char(a.msd, 'MM/DD/YYYY') != '10/10/2030'If a.msd is a date then you should e converting on the other side ie.
and a.msd != TO_DATE('11/11/2030', 'MM/DD/YYYY')
and a.msd != TO_DATE('10/10/2030', 'MM/DD/YYYY')Also, you may want to take into consideration nothing being input in :P2_ITEM_NUMBER like this...
AND INSTR(a.item_number,NVL(:P2_ITEM_NUMBER,a.item_number)) > 0Is item number actually a number or char field? If it's a number, you want to explicitly convert it to a string for using INSTR like this...
AND INSTR(TO_CHAR(a.item_number),NVL(TO_CHAR(:P2_ITEM_NUMBER),TO_CHAR(a.item_number))) > 0?
Cheers
Ben -
Binary to XML using GUI_DOWNLOAD
Hi,
I am trying to download (local) the data in binary format to XML using CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD. But the data that has been downloaded contains all chinese characters instead of the actual data. And this doesn't happen everytime I download the file, but very sporadic. I am guessing this is something to do with the code pade. I have tried using different code pages and couldn't resolve the issue. we are on 4.7 and it is non-unicode.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
EXPORTING
BIN_FILESIZE = L_LEN
FILETYPE = 'BIN'
FILENAME = 'C:/XML/Test.xml'
CODEPAGE = '4110'
CHANGING
DATA_TAB = LT_DATA
Please advise.Hi Tony,
you might want to check out interface IF_IXML and class CL_IXML_80_20 for conversions before download.
example:
form xstring_download using p_xml_xstring type xstring.
data: lt_filename type standard table of file_table with header line.
data: lv_rc type i. " Anzahl der Dateien := 1.
* Deklarationen für DOWNload...
data: lv_download_rc type sysubrc.
data: lv_filename type string.
types: lty_x_line(256) type x,
lty_x_tab type table of lty_x_line.
data:
lr_ixml type ref to if_ixml,
lr_document type ref to if_ixml_document,
lr_streamfactory type ref to if_ixml_stream_factory,
lr_parser type ref to if_ixml_parser,
lr_istream type ref to if_ixml_istream,
lv_xtab_size type i,
lt_xtab type lty_x_tab.
*** STEP 1
*** transform XML String of type XSTRING into Table
* create the ixml main factory
lr_ixml = cl_ixml=>create( ).
* create a stream factory
lr_streamfactory = lr_ixml->create_stream_factory( ).
* create a input stream
lr_istream =
lr_streamfactory->create_istream_xstring( string = p_xml_xstring ).
* create a ixml document (DOM Respresentation)
lr_document = lr_ixml->create_document( ).
* create a xml parser
lr_parser = lr_ixml->create_parser(
document = lr_document
stream_factory = lr_streamfactory
istream = lr_istream ).
* parse document
check lr_parser->parse( ) = 0.
* render to table of x -> default encoding utf-8
call method cl_ixml_80_20=>render_to_table_of_x "also: table_of_c
exporting
document = lr_document
pretty_print = 1
importing
stream_table = lt_xtab
stream_table_size = lv_xtab_size.
*** Step 2
*** Download
* Init
clear lv_rc.
refresh lt_filename.
lv_download_rc = 4.
while lv_download_rc ne 0.
call method cl_gui_frontend_services=>file_open_dialog
changing
file_table = lt_filename[]
rc = lv_rc
exceptions
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
others = 5.
if sy-subrc <> 0.
* MESSAGE annn(kkkk) WITH space. "<<<<<< adjust
elseif lv_rc lt 1. "e.g. abort by user
exit. "from while loop.
endif.
if not lt_filename[] is initial.
read table lt_filename index 1.
move lt_filename-filename to lv_filename. "implicit conversion
call function 'GUI_DOWNLOAD'
exporting
bin_filesize = lv_xtab_size
filename = lv_filename
filetype = 'BIN'
tables
data_tab = lt_xtab
exceptions
others = 1.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
if sy-subrc <> 0.
* MESSAGE innn(kkkk) WITH g_filename. <<<<<< adjust
* GUI-Übertragungsfehler (UPLOAD &1)
else.
lv_download_rc = 0.
endif.
endif. "not lt_filename[] is initial.
endwhile.
endform . "xstring_download
have fun!
hp -
How to remove Unicode from XML file
I get following error when unmarshal xml:
[java] org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x15) was found in the element content of the document.
Anyone know how to remove Unicode from xml file? Can I remove the unicode by rebuild the file?
ThanksThese sort of error usually occur when you're using a different character encoding to read the file than the one you wrote it with. Perhaps if you were to post the problem section of the file and/or the code that created it in the first place.
-
List of SQL tables and attributes used in SSRS reports
Hi,
I have around 450-500 reports deployed in SSRS reporting server.
All these reports are built on SQL from multiple databases, and these databases are having unnecessary tables and attributes.
My requirement is to clean the unused tables and attributes from the databases. For this, I need the list of SQL tables and attributes used in these 450-500 SSRS reports.
Is there any way to get this data?
Regards,
RKHi RK,
According to your description, you want to get a list of the tables and attributes used in all reports.
In your scenario, you can query the ReportServer.dbo.Catalog table to get Report name, data source name, dataset name, and query used in the dataset with query below:
WITH XMLNAMESPACES ( DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd )
SELECT ReportName = name
,DataSetName = x.value('(@Name)[1]', 'VARCHAR(250)')
,DataSourceName = x.value('(Query/DataSourceName)[1]','VARCHAR(250)')
,CommandText = x.value('(Query/CommandText)[1]','VARCHAR(250)')
,Fields = df.value('(@Name)[1]','VARCHAR(250)')
,DataField = df.value('(DataField)[1]','VARCHAR(250)')
,DataType = df.value('(rd:TypeName)[1]','VARCHAR(250)')
--,ConnectionString = x.value('(ConnectionProperties/ConnectString)[1]','VARCHAR(250)')
FROM ( SELECT C.Name,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML
FROM ReportServer.dbo.Catalog C
WHERE C.Content is not null
AND C.Type = 2
) a
CROSS APPLY reportXML.nodes('/Report/DataSets/DataSet') r ( x )
CROSS APPLY x.nodes('Fields/Field') f(df)
ORDER BY name
For more information, please refer to this similar thread:
Extract metadata from report server database
If you have any question, please feel free to ask.
Best regards,
Qiuyun Yu
Qiuyun Yu
TechNet Community Support -
Display sql output in xml format
Hi,
We are using Oracle 9i. I want to display output of a sql query as xml format.
I noticed EXTRACT function in SQL does this. Can anyone please explain XMLType instance and XPath string parameters of this function.
All of my table columns are NUMBER/VARCHAR2 data types and the table is also NOT a XML Type. Please let me know the solution.
Thanks.SQL> select dbms_xmlquery.getxml('select * from scott.emp where rownum < 3') from dual ;
DBMS_XMLQUERY.GETXML('SELECT*FROMSCOTT.EMPWHEREROWNUM<3')
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>12/17/1980 0:0:0</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW num="2">
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>2/20/1981 0:0:0</HIREDATE>
<SAL>1600</SAL>
<COMM>304</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
</ROWSET>
1 row selected.
SQL> select XMLType(dbms_xmlquery.getxml('select * from scott.emp where rownum < 3')).extract('/ROWSET/ROW[@num = "2"]/ENAME/text()').getStringVal() from dual ;
XMLTYPE(DBMS_XMLQUERY.GETXML('SELECT*FROMSCOTT.EMPWHEREROWNUM<3')).EXTRACT('/ROWSET/ROW[@NUM="2"]/ENAME/TEXT()').GETSTRINGVAL()
ALLEN
1 row selected.
SQL> -
Sql:variable and XML query performance
Can someone help with sql:variable() in xml queries? It seems that when I attempt to reference variables with the sql:variable(...) function in an xpath function (exist or nodes) it comes up with a totally different query plan, possibly ignoring
my secondary indices like the ones for VALUE, PATH.
But if I replace sql:variable("@p_ObjectIdentifierForReference") with the literal (ie. "ord/p/ord0616.p") then it uses secondary indices more consistently.
Below you will see an unsuccessful attempt to get the query to "OPTIMIZE FOR" a specific literal value of @p_ObjectIdentifierForReference. But this doesn't give work. It doesn't give me a plan using the secondary index I expect.
Ideally there would be a way to get the sql:variable(...) function to give the same query plan as a literal. Not sure why that isn't the default behavior.
DECLARE
@p_ObjectIdentifierForReference
varchar(500);
SET
@p_ObjectIdentifierForReference
= 'ord/p/ord0616.p';
WITH
XMLNAMESPACES ('uri:schemas-progress-com:XREFD:0004'
as D)
SELECT
XREF_FileDataReference.XREF_FileData
AS XrefFileData,
InnerRowNode.value('/D:Reference[1]/D:File-num[1]',
'int')
AS FileNumber,
InnerRowNode.value('/D:Reference[1]/D:Line-num[1]',
'int')
AS LineNumber
FROM
(SELECT
XREF.XREF_FileData.XREF_FileData,
XREF.XREF_FileData.XREF_FileEntry,
InnerRow.query('.')
AS InnerRowNode
FROM
XREF.XREF_FileData
OUTER APPLY
DataXref.nodes('/D:Cross-reference/D:Source/D:Reference[@Object-identifier = sql:variable("@p_ObjectIdentifierForReference")
and @Reference-type = "RUN"]')
as T(InnerRow)
WHERE DataXref.exist('/D:Cross-reference/D:Source/D:Reference[@Object-identifier
= sql:variable("@p_ObjectIdentifierForReference") and @Reference-type = "RUN"]')
= 1)
AS XREF_FileDataReference
INNER
JOIN XREF.XREF_MemberBuilt
ON XREF_MemberBuilt.XREF_FileData
= XREF_FileDataReference.XREF_FileData
INNER
JOIN XREF.XREF_FileEntry
ON XREF_FileEntry.XREF_FileEntry
= XREF_FileDataReference.XREF_FileEntry
WHERE
XREF_MemberBuilt.XREF_ProjectBuilt
= 69
OPTION(RECOMPILE,
OPTIMIZE FOR (@p_ObjectIdentifierForReference
= 'ord/p/ord0616.p')I tried to create a "repro" of your query so we can work on it and try and improve it, but I got the best results by just adding text() and [1] to it, eg
SELECT
XREF_FileDataReference.XREF_FileData AS XrefFileData,
InnerRowNode.value('(/D:Reference/D:File-num/text())[1]', 'int') AS FileNumber,
InnerRowNode.value('(/D:Reference/D:Line-num/text())[1]', 'int') AS LineNumber
FROM (
In my main repro, even with a large piece of xml with 100,000 elements, there still wasn't much difference between the queries:
USE tempdb
GO
IF NOT EXISTS ( SELECT * FROM sys.schemas WHERE name = 'XREF' )
EXEC( 'CREATE SCHEMA XREF' )
GO
IF OBJECT_ID('XREF.XREF_FileData') IS NOT NULL DROP TABLE XREF.XREF_FileData
CREATE TABLE XREF.XREF_FileData
rowId INT IDENTITY,
DataXref XML,
XREF_FileData INT,
XREF_FileEntry INT,
CONSTRAINT PK_XREF_FileData PRIMARY KEY ( rowId )
GO
IF OBJECT_ID('XREF.XREF_MemberBuilt') IS NOT NULL DROP TABLE XREF.XREF_MemberBuilt
CREATE TABLE XREF.XREF_MemberBuilt
XREF_ProjectBuilt INT,
XREF_FileData INT
GO
IF OBJECT_ID('XREF.XREF_FileEntry') IS NOT NULL DROP TABLE XREF.XREF_FileEntry
CREATE TABLE XREF.XREF_FileEntry
XREF_FileEntry INT
GO
-- Create larger piece of xml for repro
;WITH XMLNAMESPACES ( DEFAULT 'uri:schemas-progress-com:XREFD:0004' ), cte AS (
SELECT TOP 100000 ROW_NUMBER() OVER ( ORDER BY ( SELECT 1 ) ) rn
FROM master.sys.columns c1
CROSS JOIN master.sys.columns c2
CROSS JOIN master.sys.columns c3
INSERT INTO XREF.XREF_FileData ( DataXref, XREF_FileData, XREF_FileEntry )
SELECT
SELECT
CASE rn WHEN 9999 THEN 'ord/p/ord0616.p' ELSE CAST( rn AS VARCHAR(20) ) END AS "@Object-identifier",
'RUN' AS "@Reference-type",
SELECT
rn AS "File-num",
rn * 10 AS "Line-num"
FOR XML PATH(''), TYPE
) AS "*"
FROM cte
FOR XML PATH('Reference'), ROOT('Source'), TYPE
).query('<Cross-reference xmlns="uri:schemas-progress-com:XREFD:0004">{.}</Cross-reference>'), 1, 100
INSERT INTO XREF.XREF_FileEntry ( XREF_FileEntry )
VALUES ( 100 )
INSERT INTO XREF.XREF_MemberBuilt ( XREF_ProjectBuilt, XREF_FileData )
VALUES ( 69, 1 )
GO
--SELECT * FROM XREF.XREF_FileData
--SELECT * FROM XREF.XREF_FileEntry
--SELECT * FROM XREF.XREF_MemberBuilt
--GO
-- Add primary XML index
CREATE PRIMARY XML INDEX xidx_XREF_FileData ON XREF.XREF_FileData (DataXref)
GO
-- Add value, property and path xml indexes
CREATE XML INDEX xvalidx_XREF_FileData ON XREF.XREF_FileData (DataXref)
USING XML INDEX xidx_XREF_FileData FOR VALUE
CREATE XML INDEX xpthidx_XREF_FileData ON XREF.XREF_FileData (DataXref)
USING XML INDEX xidx_XREF_FileData FOR PATH
CREATE XML INDEX xprpidx_XREF_FileData ON XREF.XREF_FileData (DataXref)
USING XML INDEX xidx_XREF_FileData FOR PROPERTY
GO
:exit
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
GO
DECLARE @p_ObjectIdentifierForReference varchar(500);
SET @p_ObjectIdentifierForReference = 'ord/p/ord0616.p';
;WITH XMLNAMESPACES ('uri:schemas-progress-com:XREFD:0004' as D)
SELECT
XREF_FileDataReference.XREF_FileData AS XrefFileData,
InnerRowNode.value('/D:Reference[1]/D:File-num[1]', 'int') AS FileNumber,
InnerRowNode.value('/D:Reference[1]/D:Line-num[1]', 'int') AS LineNumber
FROM (
SELECT
XREF.XREF_FileData.XREF_FileData,
XREF.XREF_FileData.XREF_FileEntry,
InnerRow.query('.') AS InnerRowNode
FROM XREF.XREF_FileData
OUTER APPLY DataXref.nodes('/D:Cross-reference/D:Source/D:Reference[@Object-identifier = sql:variable("@p_ObjectIdentifierForReference") and @Reference-type = "RUN"]') as T(InnerRow)
WHERE DataXref.exist('/D:Cross-reference/D:Source/D:Reference[@Object-identifier = sql:variable("@p_ObjectIdentifierForReference") and @Reference-type = "RUN"]') = 1
) AS XREF_FileDataReference
INNER JOIN XREF.XREF_MemberBuilt ON XREF_MemberBuilt.XREF_FileData = XREF_FileDataReference.XREF_FileData
INNER JOIN XREF.XREF_FileEntry ON XREF_FileEntry.XREF_FileEntry = XREF_FileDataReference.XREF_FileEntry
WHERE XREF_MemberBuilt.XREF_ProjectBuilt = 69
OPTION( RECOMPILE, OPTIMIZE FOR (@p_ObjectIdentifierForReference = 'ord/p/ord0616.p') )
GO
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
GO
DECLARE @p_ObjectIdentifierForReference varchar(500);
SET @p_ObjectIdentifierForReference = 'ord/p/ord0616.p';
;WITH XMLNAMESPACES ('uri:schemas-progress-com:XREFD:0004' as D)
SELECT
XREF_FileDataReference.XREF_FileData AS XrefFileData,
InnerRowNode.value('(/D:Reference/D:File-num/text())[1]', 'int') AS FileNumber,
InnerRowNode.value('(/D:Reference/D:Line-num/text())[1]', 'int') AS LineNumber
FROM (
SELECT
XREF.XREF_FileData.XREF_FileData,
XREF.XREF_FileData.XREF_FileEntry,
InnerRow.query('.') AS InnerRowNode
FROM XREF.XREF_FileData
OUTER APPLY DataXref.nodes('/D:Cross-reference/D:Source/D:Reference[@Object-identifier = sql:variable("@p_ObjectIdentifierForReference") and @Reference-type = "RUN"]') as T(InnerRow)
WHERE DataXref.exist('/D:Cross-reference/D:Source/D:Reference[@Object-identifier = sql:variable("@p_ObjectIdentifierForReference") and @Reference-type = "RUN"]') = 1
) AS XREF_FileDataReference
INNER JOIN XREF.XREF_MemberBuilt ON XREF_MemberBuilt.XREF_FileData = XREF_FileDataReference.XREF_FileData
INNER JOIN XREF.XREF_FileEntry ON XREF_FileEntry.XREF_FileEntry = XREF_FileDataReference.XREF_FileEntry
WHERE XREF_MemberBuilt.XREF_ProjectBuilt = 69
OPTION( RECOMPILE, OPTIMIZE FOR (@p_ObjectIdentifierForReference = 'ord/p/ord0616.p') )
GO
So I guess I'm saying I cannot reproduce your problem on SQL 2008 R2 or SQL 2012. Does anything about this repro stand out as different from your situation?
Looking at your query I would say you might consider the following:
are you really seeing big differences in query duration?
pretty much ignore estimated plan costs for xml queries
consider breaking it up; eg carve off the xml then do the joins? If poor cardinality estimation is part of the problem this might help
Understand what PATH, PROPERTY and VALUE are for, then only create the ones you need
do you really have the range of queries that requires all three?
this is still a great article on xml indexes:
http://technet.microsoft.com/en-us/library/ms191497.aspx
What's performance like with the primary xml index only?
If performance is that important, consider materialising the columns permanently
I think the buffer_descriptors stuff is a distraction - mostly your cache is warm right?
plan forcing could be a last resort
Selective XML indexes in SQL 2012 onwards are great : ) much less storage required for example but much more specific -
Folks
I need to separate SQL statements from Java Code, How do i put these SQL Statements in an XML file and how to access these SQL statements from a Java code,
Any help with sample code is greatful,The use of entities as kstc_jyu may help. It really depends on how you design the XML vocabulary based on the expected usage (e.g., if the SQL statements change very often).
Back to the original question, I am right to interpret "how to use SQL statements in XML ?" as how to design an XML vocabulary to store SQL statements?
If not, you can simply use the scheme proposed by DrClap. Reading and extracting the SQL statement would be just as you would with any other XML document. Google for a Java XML tutorial. -
Read, Modify and Apply Report XML using Java Script
Hi Guys,
Is there any way that we can Pragmatically Read, Modify and Apply Report XML using Java Script or some other way.
Thanks
Kaushik
Edited by: Kaushik K on Jun 20, 2012 8:36 PMRequirement ::
Users should be able to add Column to the Report Dynamically at Runtime.
(There are around 1000+ Users, Answers Approach is not acceptable)
So we are planning to provide a Multi Select / Shuttle Box Option for Users to add Columns dynamically. (Only for Table View)
What we planned to DO ::
Create a Presentation Variable Prompt, Which reads the Metadata Table (Presentation Table.Column Name, populated using the Metadata Dictionary)
And Create a report with One Column and the Column Fx like @{var_dynamic_columns}{'"Time"."Year","Time"."Month"'}
With this, OBIEE is rewriting the Logical SQL Currently as "Select "Time"."Year","Time"."Month" from "A - Sample Sales" "
But getting an error
The number of columns returned in retrieving column metadata was invalid (expected: 1; received: 2)
So we want to see, if we can rewrite the Advanced XML of the Report to have dynamic columns based on the Values from the Presentation Variable.
Please help me if this is a viable solution or any other better solution. -
Merge LiveCycle Form with XML using JAVA
Hello.
I am trying to find out how to merge non-interactive form with XML (using JAVA) so the users can see the final output form with the data filled in.
What are my choices..?
So far, I have created the interactive forms as template using LiveCycle 8 and wrote ASP.NET code to extract data and store it in SQL database when the user fill out and submit the form.
It works great but another agency wants to access the form as well.
They told us that they will create the XML themselves from the database, so they just need to combine the form with XML to display it (non-interactive form).
They want to use JAVA but I am not sure how to do that...
Any suggestion?Assuming that you start with XML in an org.w3c.dom.Document that stores the XML data. Before you can merge it into a form, you have to convert it to a com.adobe.idp.Document object. TO convert a org.w3c.dom.Document to a com.adobe.idp.Document object -- use the following Java code:
private Document convertDataSource(org.w3c.dom.Document myDOM)
byte[] mybytes = null;
try
//Create a Java Transformer object
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer transForm = transFact.newTransformer();
//Create a Java ByteArrayOutputStream object
ByteArrayOutputStream myOutStream = new ByteArrayOutputStream();
//Create a Java Source object
javax.xml.transform.dom.DOMSource myInput = new DOMSource(myDOM);
//Create a Java Result object
javax.xml.transform.stream.StreamResult myOutput = new StreamResult(myOutStream);
//Populate the Java ByteArrayOutputStream object
transForm.transform(myInput,myOutput);
// Get the size of the ByteArrayOutputStream buffer
int myByteSize = myOutStream.size();
//Allocate myByteSize to the byte array
mybytes = new byte[myByteSize];
//Copy the content to the byte array
mybytes = myOutStream.toByteArray();
catch (Exception e) {
System.out.println("The following exception occurred: "+e.getMessage());
//Create a com.adobe.idp.Document object and copy the
//contents of the byte array
Document myDocument = new Document(mybytes);
return myDocument;
THen you can merge myDocument into the Form using renderPDFFOrm:
FormsResult formOut = formsClient.renderPDFForm(
formName, //formQuery
myDocument, //inDataDoc
pdfFormRenderSpec, //PDFFormRenderSpec
uriValues, //urlSpec
fileAttachments //attachments
Hope this helps! -
Gurus,
Is it possible to read/write XML using DB Link?
If yes please let me know how to achieve this.
Thanks in Advance.
VenuYou need to use quoted names. SQL Server data dictionary stores names in same case they were entered while Oracle in upper case. So when you issue
Select test.status from testtable@DBLINK test Oracle parser will look for column STATUS while on SQL Server side it could be stored, for examle, as Status or status. Check column names on SQL Server side and use quoted names. Assuming column name is Status:
Select test."Status" from testtable@DBLINK test SY.
Maybe you are looking for
-
MacBook Pro very, very slow, 20 hours to open in safe mode
I realize this is for the Macpro but the Macbook Pro site has way to much spam on it and I was wondering if somebody on this list could help me. I have a Macbook pro, intel core 2 120 hard drive with 2 GB ram. I think the 2.2 but not positive.
-
Restriction not working up properly in Query
Hi, In BI Backend, i have 2 Info Objects in my Infocube, Movement type & Posting date. There are totally 3 movement types, A B & C. In my Query, i have to show up the posting date based on the Movement types in seperate columns. Say, Movement type
-
I'm relatively new to Java. I'm creating a program that will be running on 40 terminals, and will simulate a wireless mobile network. Our teacher has instructed that we should simply use a text file to keep track of where all the nodes are in the net
-
input.readBytes(bytes, 0, input.bytesAvailable); input could be null.
-
Everything started when I tried to use a Huawei EC168 USB Stick to connect to the Internet. When it installs the program used to run this device into the computer, and tries to install the drivers for this purpose it installs everything but what I su