我在将 Saxon 配置为在 oXygen 和 eXist-db 中使用 MySQL 时遇到困难。这是我在 eXist-db xquery 中的尝试。没有错误,我确实得到了一个连接对象(因此从 my.cnf 中提取的字段似乎确实有效),但
sql:execute()
没有返回任何结果。有什么建议吗?
xquery version "3.1";
declare namespace transform="http://exist-db.org/xquery/transform";
let $xml := <root/>
let $xsl := <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:file="http://expath.org/ns/file"
xmlns:wq="https://winequest.com"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:sql="http://saxon.sf.net/sql"
exclude-result-prefixes="file wq xs map sql"
version="3.0" expand-text="yes">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="/">
<xsl:variable name="cnf" select="file:read-text('/etc/my.cnf')"/>
<xsl:variable name="client" select="$cnf => replace('^.*\[client\]', '', 's') => replace('\[[^\]]+\].*$', '', 's')" as="xs:string"/>
<xsl:variable name="host" select="analyze-string($client, 'host\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
<xsl:variable name="database" select="analyze-string($client, 'database\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
<xsl:variable name="user" select="analyze-string($client, 'user\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
<xsl:variable name="password" select="analyze-string($client, 'password\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
<xsl:variable name="connection-map" select="map{{ 'database':'jdbc:mysql://'||$host||':3306/'||$database||'?serverTimezone=America/Los_Angeles', 'driver':'com.mysql.jdbc.Driver', 'user':$user, 'password':$password, 'autoCommit':true()}}"/>
<xsl:variable name="connection" select="sql:connect($connection-map)"/>
<sql-results>
<xsl:sequence select="sql:execute($connection, 'SHOW DATABASES')"/>
</sql-results>
</xsl:template>
</xsl:stylesheet>
let $parameters :=
<parameters>
<param name="exist:stop-on-error" value="yes"/>
</parameters>
let $config :=
<configuration xmlns="http://saxon.sf.net/ns/configuration">
<xslt>
<extensionElement namespace="http://saxon.sf.net/sql" factory="net.sf.saxon.option.sql.SQLElementFactory"/>
</xslt>
</configuration>
let $results := transform:transform($xml, $xsl, $parameters, $config, ())
return $results
sql:execute()
的文档说它没有返回任何结果,因此它似乎按设计工作。它旨在允许执行 SQL 命令,以消除其副作用(如 DROP TABLE
)。
我不确定
SHOW DATABASE
命令如何在 JDBC 级别运行。我猜您会先拨打 Statement.execute()
,然后再拨打 Statement.getResultSet()
。不幸的是,我认为 Saxon 的 SQL 函数库中没有任何与此完全对应的内容。