Link to home
Start Free TrialLog in
Avatar of new name
new name

asked on

Postgres - Stored procedure XML conversion

I am trying to convert a SQL Server stored procedure to Post gres procedure but stuck up in the XML portion.  Need help in converting this XML piece of code to post gres code.

EXEC sp_xml_preparedocument @idoc OUTPUT, @ROLES;
                  UPDATE SSO_XREF_USER_ROLE SET ACTV_IND=1 WHERE
                  (CONVERT(VARCHAR,SSO_USER_ID)+CONVERT(VARCHAR,SSO_ROLE_ID)) IN
                  (SELECT CONVERT(VARCHAR,X.SSO_USER_ID)+CONVERT(VARCHAR,X.SSO_ROLE_ID) FROM
                        (SELECT XUR.SSO_USER_ID,SR.SSO_ROLE_ID FROM SSO_XREF_USER_ROLE XUR
                              JOIN SSO_ROLE SR ON XUR.SSO_ROLE_ID=SR.SSO_ROLE_ID WHERE
                              SR.SSO_ROLE_NM IN
                              (SELECT RoleName FROM
                                    OPENXML(@idoc, '/DocumentElement/UpdateRoles', 2)
                                          WITH (RoleName  varchar(100),
                                                      RoleStatus  numeric(1,0))
                                                      WHERE RoleStatus=1))AS X)

Not sure what is the equivalent of sp_xml_preparedocument in Postgres procedure
Avatar of Pawan Kumar
Pawan Kumar
Flag of India image

can you provide your input data and expected output. These functions are not available in postgresql.
Avatar of new name
new name

ASKER

This is the SQL server procedure i am trying to convert. Depending on the @GETBY values, i am taking certain action

CREATE PROCEDURE [dbo].[usp_SSOUser]
@GETBY VARCHAR(30) = NULL,
@EID VARCHAR(30) = NULL,
@FRST_NM VARCHAR(255) = NULL,
@LAST_NM VARCHAR(255) = NULL,
@MOD_NM VARCHAR(30) = NULL,
@SSO_USER_ID NUMERIC(12,0) = NULL,
@CRET_NM VARCHAR(30) = NULL,
@CRET_TS DATETIME = NULL,
@ACTV_IND NUMERIC(1,0) = NULL,
@ROLES XML = NULL
AS
SET NOCOUNT ON;
BEGIN TRANSACTION
      BEGIN TRY
            IF(UPPER(@GETBY)='GETUSERS')
            BEGIN
                  SELECT SU.SSO_USER_ID AS User_ID, SU.ACTV_IND AS Active,
                        LTRIM(SU.LAST_NM) +', '+  ltrim(SU.FRST_NM) AS  Name,
                        UPPER(ltrim(SU.EID)) AS EnterpriseID
                              FROM  SSO_USER SU
                              ORDER BY SU.ACTV_IND DESC, upper(SU.LAST_NM)
            END
            ELSE IF(UPPER(@GETBY)='GETROLES')
            BEGIN
                  SELECT SSO_ROLE_NM, SSO_ROLE_ID
                        FROM  SSO_ROLE WHERE ACTV_IND = 1
            END
            ELSE IF(UPPER(@GETBY)='GETXREF')
            BEGIN
                  SELECT XUR.SSO_USER_ID,XUR.SSO_ROLE_ID,SR.SSO_ROLE_NM
                        FROM SSO_XREF_USER_ROLE XUR,SSO_ROLE SR
                        WHERE XUR.SSO_ROLE_ID = SR.SSO_ROLE_ID AND
                              XUR.ACTV_IND = 1 AND SR.ACTV_IND = 1
            END
            ELSE IF(UPPER(@GETBY)='DUPLICATECHECK')
            BEGIN
                  SELECT count(*) FROM SSO_USER WHERE EID= @EID
            END
            ELSE IF(UPPER(@GETBY)='UPDUSER')
            BEGIN
                  update  SSO_USER set EID = @EID, FRST_NM = @FRST_NM,
                        LAST_NM = @LAST_NM, MOD_NM = @MOD_NM
                        where SSO_USER_ID = @SSO_USER_ID
            END
            ELSE IF(UPPER(@GETBY)='INSUSER')
            BEGIN
                  INSERT INTO SSO_USER(EID, FRST_NM, LAST_NM, ACTV_IND, CRET_NM, MOD_NM,CRET_TS)
                        VALUES (@EID,@FRST_NM,@LAST_NM,1,@CRET_NM,@MOD_NM,@CRET_TS)
            END
            ELSE IF(UPPER(@GETBY)='ACTIVATE')
            BEGIN
                  UPDATE SSO_USER SET ACTV_IND = 1, MOD_NM = @CRET_NM
                        where SSO_USER_ID = @SSO_USER_ID
            END
            ELSE IF(UPPER(@GETBY)='DEACTIVATE')
            BEGIN
                  UPDATE SSO_USER SET ACTV_IND = 0, MOD_NM = @CRET_NM
                        where SSO_USER_ID = @SSO_USER_ID
            END
            ELSE IF(UPPER(@GETBY)='UPDATEROLEACCESS')
            BEGIN
            DECLARE @idoc int;
            EXEC sp_xml_preparedocument @idoc OUTPUT, @ROLES;
                  UPDATE SSO_XREF_USER_ROLE SET ACTV_IND=1 WHERE
                  (CONVERT(VARCHAR,SSO_USER_ID)+CONVERT(VARCHAR,SSO_ROLE_ID)) IN
                  (SELECT CONVERT(VARCHAR,X.SSO_USER_ID)+CONVERT(VARCHAR,X.SSO_ROLE_ID) FROM
                        (SELECT XUR.SSO_USER_ID,SR.SSO_ROLE_ID FROM SSO_XREF_USER_ROLE XUR
                              JOIN SSO_ROLE SR ON XUR.SSO_ROLE_ID=SR.SSO_ROLE_ID WHERE
                              SR.SSO_ROLE_NM IN
                              (SELECT RoleName FROM
                                    OPENXML(@idoc, '/DocumentElement/UpdateRoles', 2)
                                          WITH (RoleName  varchar(100),
                                                      RoleStatus  numeric(1,0))
                                                      WHERE RoleStatus=1))AS X)
                                                      
                  UPDATE SSO_XREF_USER_ROLE SET ACTV_IND=0 WHERE
                  (CONVERT(VARCHAR,SSO_USER_ID)+CONVERT(VARCHAR,SSO_ROLE_ID)) IN
                  (SELECT CONVERT(VARCHAR,X.SSO_USER_ID)+CONVERT(VARCHAR,X.SSO_ROLE_ID) FROM
                        (SELECT XUR.SSO_USER_ID,SR.SSO_ROLE_ID FROM SSO_XREF_USER_ROLE XUR
                              JOIN SSO_ROLE SR ON XUR.SSO_ROLE_ID=SR.SSO_ROLE_ID WHERE
                              SR.SSO_ROLE_NM IN
                              (SELECT RoleName FROM
                                    OPENXML(@idoc, '/DocumentElement/UpdateRoles', 2)
                                          WITH (RoleName  varchar(100),
                                                      RoleStatus  numeric(1,0))
                                                      WHERE RoleStatus=0))AS X)
                  INSERT INTO SSO_XREF_USER_ROLE(SSO_USER_ID,SSO_ROLE_ID,ACTV_IND,CRET_NM,CRET_TS)
                  SELECT X.SSO_USER_ID,X.SSO_ROLE_ID,1,@CRET_NM,GETDATE() FROM
                        (SELECT XUR.SSO_USER_ID,SR.SSO_ROLE_ID FROM SSO_XREF_USER_ROLE XUR
                              JOIN SSO_ROLE SR ON XUR.SSO_ROLE_ID=SR.SSO_ROLE_ID WHERE
                              SR.SSO_ROLE_NM IN
                              (SELECT RoleName FROM
                                    OPENXML(@idoc, '/DocumentElement/UpdateRoles', 2)
                                          WITH (RoleName  varchar(100),
                                                      RoleStatus  numeric(1,0))
                                                      ))AS X
                                                      WHERE CONVERT(VARCHAR,X.SSO_USER_ID)+CONVERT(VARCHAR,X.SSO_ROLE_ID) NOT IN
                                                            (SELECT CONVERT(VARCHAR,SSO_USER_ID)+CONVERT(VARCHAR,SSO_ROLE_ID)
                                                                  FROM SSO_XREF_USER_ROLE WHERE ACTV_IND=1)
                                                                  
                                                                  
                                                                              
                                                                  
            END
      END TRY
      BEGIN CATCH
            IF @@TRANCOUNT > 0
                  ROLLBACK TRANSACTION;
      END CATCH
IF @@TRANCOUNT > 0
      COMMIT;
Have not received any update this? What is the equivalent for this code in Post gres for SP_XML_PREPAREDOCUMENT and also for openxml

EXEC sp_xml_preparedocument @idoc OUTPUT, @ROLES;
                  UPDATE SSO_XREF_USER_ROLE SET ACTV_IND=1 WHERE
                  (CONVERT(VARCHAR,SSO_USER_ID)+CONVERT(VARCHAR,SSO_ROLE_ID)) IN
                  (SELECT CONVERT(VARCHAR,X.SSO_USER_ID)+CONVERT(VARCHAR,X.SSO_ROLE_ID) FROM
                        (SELECT XUR.SSO_USER_ID,SR.SSO_ROLE_ID FROM SSO_XREF_USER_ROLE XUR
                              JOIN SSO_ROLE SR ON XUR.SSO_ROLE_ID=SR.SSO_ROLE_ID WHERE
                              SR.SSO_ROLE_NM IN
                              (SELECT RoleName FROM
                                    OPENXML(@idoc, '/DocumentElement/UpdateRoles', 2)
                                          WITH (RoleName  varchar(100),
                                                      RoleStatus  numeric(1,0))
                                                      WHERE RoleStatus=1))AS X)
This ( SP_XML_PREPAREDOCUMENT )  is not available in Postgre SQL

Is PostgreSQL we can use xpath and Unnest for XML parsing and data extraction.

Please go through the XML documentation from postgreSQL site

https://www.postgresql.org/docs/9.1/static/functions-xml.html
Appreciate if i can get the exact replacement for these SQLServer in PostgresSQL

EXEC sp_xml_preparedocument @idoc OUTPUT, @ROLES;
  OPENXML(@idoc, '/DocumentElement/UpdateRoles', 2)
                                          WITH (RoleName  varchar(100),
                                                      RoleStatus  numeric(1,0))
                                                      WHERE RoleStatus=1))AS X)
This question needs an answer!
Become an EE member today
7 DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform.
View membership options
or
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.