﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Steven Feuerstein's Blog</title>
    <description>&lt;table cellspacing="1" cellpadding="1"&gt;
        &lt;tr&gt;
            &lt;td valign="top"&gt;&lt;img height="183" alt="" width="139" src="/Portals/0/Blog/blog-steven-feuerstein.png" /&gt;&lt;/td&gt;
            &lt;td valign="top"&gt;Steven Feuerstein is considered one of the world's leading experts on the Oracle PL/SQL language, having written ten books on PL/SQL (all published by O'Reilly Media, including Oracle PL/SQL Programming. Steven has been developing software since 1980, spent five years with Oracle (1987-1992) and has served as PL/SQL Evangelist for Quest Software since January 2001. He is also an Oracle ACE Director. He writes regularly for Oracle Magazine, which named him the PL/SQL Developer of the Year in both 2002 and 2006.
            &lt;p&gt;&amp;#160;Steven's blog provides advice and code that you can put to immediate use in your world of programming.&amp;#160;&lt;/p&gt;
            &lt;p&gt;&lt;font color="#003366" size="3"&gt;&lt;strong&gt;Recent postings on his  PL/SQL Obsession:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
&lt;/table&gt;</description>
    <link>http://www.toadworld.com/BLOGS/tabid/67/BlogId/13/Default.aspx</link>
    <language>en-US</language>
    <managingEditor>Steven Feuerstein</managingEditor>
    <webMaster>webmaster@toadworld.com</webMaster>
    <pubDate>Fri, 12 Mar 2010 08:34:25 GMT</pubDate>
    <lastBuildDate>Fri, 12 Mar 2010 08:34:25 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 3.2.0.15477</generator>
    <item>
      <title>Run an OS command from within PL/SQL</title>
      <description>&lt;div&gt;
&lt;p&gt;Developers are hard people to satisfy. Oracle gives us this incredibly robust, powerful and easy to use database programming language – and all we can do is complain about what it &lt;em&gt;doesn't &lt;/em&gt;do for us.&lt;/p&gt;
&lt;p&gt;Well, that's reality for you: PL/SQL is powerful and robust and easy to use, but also very narrowly focused. So if you want it to do something outside of its area of expertise, sometimes you have to jump through a few more hoops than you'd like.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;A good example of this is figuring out how to run an OS command from a PL/SQL block. There is not, unfortunately, a native "execute host command" statement within PL/SQL . Instead, Oracle offers (at least) three ways to do this:&lt;/div&gt;
&lt;ul type="disc"&gt;
    &lt;li&gt;Use the DBMS_SCHEDULER package&lt;/li&gt;
    &lt;li&gt;Run a Java method to execute your command.&lt;/li&gt;
    &lt;li&gt;Run a C program to execute your command.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DBMS_SCHEDULER offers the simplest and most intuitive solution, especially from the standpoint of DBA and system administration tasks. I talk about this solution on the OTN Best Practice page:&lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px"&gt;
&lt;p&gt;&lt;a href="http://apex.oracle.com/pls/otn/f?p=2853:4:1544539351000407::NO::P4_QA_ID:16282"&gt;http://apex.oracle.com/pls/otn/f?p=2853:4:1544539351000407::NO::P4_QA_ID:16282&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I will, in this Toad World blog, offer brief guidance on the other two options. It is very unlikely that you will be able to rely solely on the content below to implement either approach. Instead, I suggest you use this as a starting point and then from there visit the detailed &lt;a href="http://tahiti.oracle.com"&gt;&lt;strong&gt;Oracle documentation&lt;/strong&gt;&lt;/a&gt; and/or the full chapter coverage of both these techniques in my &lt;a href="http://www.oreillynet.com/cs/catalog/view/au/344"&gt;&lt;strong&gt;Oracle PL/SQL Programming&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font size="3"&gt;Executing an OS command with Java&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With the Java approach, you will take these steps:&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;Find the Java class that implements host command execution.&lt;/li&gt;
    &lt;li&gt;Build a class that invokes that host command method. Let's call it HostCommand.&lt;/li&gt;
    &lt;li&gt;Build a PL/SQL program that calls a method in HostCommand to run your command.&lt;/li&gt;
    &lt;li&gt;Acquire the privileges needed to execute host commands via Java in the database.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let's go through each of these steps.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Find the Java class that implements host command execution.&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;
    Objects of the java&lt;strong&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang&lt;strong&gt;.&lt;/strong&gt;Runtime&lt;/span&gt; class include an &lt;em&gt;exec&lt;/em&gt; method that will execute a host command.&lt;br /&gt;
     &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Build a class that invokes that host command method. Let's call it HostCommand.&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;
    Here's code to create a new Java class in the database to invoke this command for the Windows XP operating system:&lt;br /&gt;
    &lt;br /&gt;
    &lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED&lt;/font&gt; &lt;font color="#ff0000"&gt;"UTLcmd"&lt;/font&gt;&lt;br /&gt;
    &lt;font color="#0000ff"&gt;AS&lt;/font&gt; import java.lang.Runtime;&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;br /&gt;
    public class execHostCommand&lt;br /&gt;
    { &lt;br /&gt;
      public static void execute (String command) &lt;br /&gt;
        throws java.io.IOException&lt;br /&gt;
      {&lt;br /&gt;
       String osName = System.getProperty("&lt;font color="#0000ff"&gt;os.name&lt;/font&gt;");&lt;br /&gt;
       if(osName.equals("&lt;font color="#0000ff"&gt;Windows XP&lt;/font&gt;"))&lt;br /&gt;
           command = "&lt;font color="#0000ff"&gt;cmd /c&lt;/font&gt; " + command;&lt;br /&gt;
       Runtime rt = java.lang.Runtime.getRuntime();&lt;br /&gt;
       rt.exec(command);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    /&lt;br /&gt;
    &lt;/font&gt;&lt;br /&gt;
    You can easily modify the execute method to support other operating systems based on the value of osName.&lt;br /&gt;
     &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Build a PL/SQL program that calls a method in HostCommand to run your command.&lt;br /&gt;
    &lt;/strong&gt;&lt;font face="Courier New" size="2"&gt;&lt;br /&gt;
    CREATE OR REPLACE PACKAGE host_command IS&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;  PROCEDURE execute (cmd IN VARCHAR2) AS LANGUAGE JAVA NAME&lt;br /&gt;
    &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;           &lt;/span&gt;'execHostCommand.execute(java.lang.String)';&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;END;&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;/&lt;br /&gt;
    &lt;/font&gt; &lt;br /&gt;
    Notice that I "map" the VARCHAR2 datatype to the java.lang.String class in my call to the new Java method.&lt;br /&gt;
     &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Acquire the privileges needed to execute host commands via Java in the database.&lt;br /&gt;
    &lt;/strong&gt; &lt;br /&gt;
    You need special privileges to execute host commands from within the database through Java. Otherwise when you try to execute your command you will see an error like this (the error message will vary depending on what you are trying to do):&lt;br /&gt;
     &lt;br /&gt;
    &lt;img height="183" alt="" width="456" src="http://www.toadworld.com/Portals/0/blogimages/Steven Feuerstein/SF-Blog032709-1.gif" /&gt;&lt;br /&gt;
     &lt;br /&gt;
    One way to obtain these privileges to have the JAVASYSPRIV role granted to your schema. This role contains all the privileges you need (and more).&lt;br /&gt;
     &lt;br /&gt;
    For a more nuanced approach to granting the required privileges, you can also use the Java security API available in the Oracle database. For example, if I want to delete a file using a host command (perhaps it is not accessible through UTL_FILE), I will need to grant the following privileges to the schema in which the command is executed, such as HR:&lt;br /&gt;
    &lt;font size="2"&gt;&lt;br /&gt;
    &lt;font face="Courier New"&gt;BEGIN&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;   &lt;/span&gt;DBMS_JAVA.grant_permission ('HR'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, 'SYS:java.io.FilePermission'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, '&lt;&lt;all files=""&gt;&lt;/all&gt;&gt;'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, 'execute'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                              &lt;/span&gt;);&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;   &lt;/span&gt;DBMS_JAVA.grant_permission ('HR'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, 'SYS:java.lang.RuntimePermission'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, 'writeFileDescriptor'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, ''&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                              &lt;/span&gt;);&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;   &lt;/span&gt;DBMS_JAVA.grant_permission ('HR'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, 'SYS:java.lang.RuntimePermission'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, 'readFileDescriptor'&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                             &lt;/span&gt;, ''&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span&gt;                              &lt;/span&gt;);&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;END;&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;/&lt;/font&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font size="3"&gt;Executing an OS command with C&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To use C, you must define an &lt;em&gt;external procedure&lt;/em&gt; and then invoke it within your PL/SQL block. It is not possible within this article to cover completely all the steps and issues involved in setting up such an external procedure. I will, instead, cover the highlights. For the full details, check out Oracle documentation at:&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&lt;blockquote dir="ltr" style="margin-right: 0px"&gt;
&lt;div&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_extern_proc.htm#ADFNS010"&gt;http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_extern_proc.htm#ADFNS010&lt;/a&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;and also read Chapter 27 of Oracle PL/SQL Programming, 4&lt;sup&gt;th&lt;/sup&gt; edition, in which my co-author Bill Pribyl thoroughly explains external procedures.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;As with Java, you will need help your database administrator to supply the privileges needed to execute your host command in C.&lt;/p&gt;
&lt;p&gt;Here are the steps to follow with C:&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;Find (or build) the C program that implements host command execution.&lt;/li&gt;
    &lt;li&gt;Save the C source to a file and generate a shared library for it.&lt;/li&gt;
    &lt;li&gt;Save the library file where Oracle can find it.&lt;/li&gt;
    &lt;li&gt;Define a library inside Oracle that is associated with the shared library on disk.&lt;/li&gt;
    &lt;li&gt;Create a PL/SQL wrapper for the C function.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let's go through each of these steps.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Find (or build) the C program that implements host command execution.&lt;/strong&gt;&lt;br /&gt;
     &lt;br /&gt;
    The C system function executes an operating system command. So I build a simple C function, extprocsh(), that accepts a string and passes it to the &lt;span&gt;&lt;font color="#ff0000"&gt;system&lt;/font&gt;&lt;/span&gt; function for execution:&lt;br /&gt;
    &lt;font size="2"&gt; &lt;br /&gt;
    &lt;font face="Courier New"&gt;int extprocsh(char *cmd)&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;{&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;   return system(cmd);&lt;br /&gt;
    &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;}&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt; &lt;br /&gt;
    The function returns the result code as provided by &lt;span&gt;&lt;font color="#ff0000"&gt;system&lt;/font&gt;&lt;/span&gt;, a function normally found in the C runtime library (&lt;span&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;libc&lt;/font&gt;&lt;/em&gt;&lt;/span&gt;) on Unix, or in &lt;span&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;msvcrt.dll&lt;/font&gt;&lt;/em&gt;&lt;/span&gt; on Microsoft platforms.&lt;br /&gt;
     &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Save the C source to a file and generate a shared library for it.&lt;br /&gt;
    &lt;/strong&gt; &lt;br /&gt;
    I save the source code in a file named &lt;span&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;extprocsh.c&lt;/font&gt;&lt;/em&gt;&lt;/span&gt;. I then use the GNU C compiler to generate a shared library. On a 64-bit Solaris machine running GCC 3.4.2 and Oracle Database 10g Release 2, the following compiler command worked to create a shared library:&lt;br /&gt;
    &lt;font size="2"&gt; &lt;br /&gt;
    &lt;font face="Courier New"&gt;gcc -m64 extprocsh.c -fPIC -G -o extprocsh.so&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt; &lt;br /&gt;
    Similarly, on Microsoft Windows XP Pro running GCC 3.2.3 from Minimal GNU for Windows (MinGW), also with Oracle Database 10g Release 2, this works:&lt;br /&gt;
    &lt;font size="2"&gt; &lt;br /&gt;
    &lt;font face="Courier New"&gt;c:\MinGW\bin\gcc extprocsh.c -shared -o extprocsh.dll&lt;br /&gt;
     &lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Save the library file where Oracle can find it.&lt;br /&gt;
    &lt;/strong&gt; &lt;br /&gt;
    These commands generate a shared library file, &lt;span&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;extprocsh.so&lt;/font&gt;&lt;/em&gt;&lt;/span&gt; or &lt;span&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;extprocsh.dll&lt;/font&gt;&lt;/em&gt;&lt;/span&gt;. Now I need to put the library file somewhere that Oracle can find it. The default locations for Windows and Unix respectively are:&lt;br /&gt;
    &lt;span&gt;&lt;font size="2"&gt;&lt;font color="#ff6600"&gt;&lt;em&gt; &lt;br /&gt;
    &lt;font face="Courier New" color="#ff0000"&gt;$ORACLE_HOME/bin&lt;br /&gt;
    &lt;/font&gt;&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;em&gt;&lt;font size="2"&gt;&lt;font face="Courier New" color="#ff0000"&gt;$ORACLE_HOME/lib&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/span&gt; &lt;br /&gt;
    If you want to use a non-default location, you will need to edit the listener configuration file and supply path value(s) for the ENVS="EXTPROC_DLLS...".&lt;br /&gt;
     &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Define a library inside Oracle that is associated with the shared library on disk.&lt;br /&gt;
    &lt;/strong&gt; &lt;br /&gt;
    After copying the file and/or making adjustments to the listener, you will then define a "library" inside Oracle to point to the DLL. For example:&lt;br /&gt;
    &lt;font face="Courier New" size="2"&gt; &lt;br /&gt;
    CREATE OR REPLACE LIBRARY extprocshell_lib &lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;   AS '/u01/app/oracle/local/lib/extprocsh.so';   &lt;font color="#009933"&gt;&lt;strong&gt;-- Unix&lt;br /&gt;
    &lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;     &lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;CREATE OR REPLACE LIBRARY extprocshell_lib&lt;br /&gt;
    &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;   AS 'c:\oracle\local\lib\extprocsh.dll';      &lt;font color="#009933"&gt;&lt;strong&gt;-- Microsoft&lt;br /&gt;
    &lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;
    &lt;strong&gt;Note:&lt;/strong&gt; performing this step requires Oracle’s CREATE LIBRARY privilege.&lt;br /&gt;
     &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Create a PL/SQL wrapper for the C function.&lt;br /&gt;
    &lt;/strong&gt; &lt;br /&gt;
    Now I can create a PL/SQL call specification which uses the newly created library:&lt;br /&gt;
    &lt;font face="Courier New" size="2"&gt; &lt;br /&gt;
    CREATE OR REPLACE FUNCTION exec_host_command (cmd IN VARCHAR2)&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;   RETURN PLS_INTEGER&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;AS&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;   LANGUAGE C&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;   LIBRARY extprocshell_lib&lt;br /&gt;
    &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;   NAME "extprocsh"&lt;br /&gt;
    &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;   PARAMETERS (cmd STRING, RETURN INT);&lt;/font&gt;&lt;/font&gt;
    &lt;p&gt;Then, assuming that your DBA has set up the system environment to support external procedures, the exec_host_command function can now be called anywhere you can invoke a PL/SQL function. &lt;/p&gt;
    &lt;p&gt;Note that these operating system commands will execute with the same privileges as the Oracle Net listener that spawns the &lt;span&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;extproc&lt;/font&gt;&lt;/em&gt;&lt;/span&gt; process. &lt;br /&gt;
     &lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt; &lt;/div&gt;</description>
      <link>http://www.toadworld.com/BLOGS/tabid/67/EntryID/356/Default.aspx</link>
      <author>Steven Feuerstein</author>
      <comments>http://www.toadworld.com/BLOGS/tabid/67/EntryID/356/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.toadworld.com/Default.aspx?tabid=67&amp;EntryID=356</guid>
      <pubDate>Fri, 27 Mar 2009 13:14:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.toadworld.com/DesktopModules/Blog/Trackback.aspx?id=356</trackback:ping>
    </item>
  </channel>
</rss>