span8
span4
的SQLCreator / SQLExecutortransformer不会对数据库运行存储过程或多个SQL语句。这些语句将在SQL+和SQL Developer中运行。如果语句失败,日志文件中将出现文本,提示用户输入分隔符。
或者在Oracle reader或其他FME转换器中执行一个带“;”结尾的SQL查询,返回一个错误:
错误是' ORA-00911:无效字符
默认情况下,FME不会分割SQL语句,并且希望单个SQL语句不会以“;”分隔符结束。如果您想在一个查询中包含多个SQL语句,这可能是个问题。如果从其他工具剪切粘贴了SQL语句,比如它包含“;
中输入SQL查询时SQLExecutor / SQLCreator或者在读写器/开始/结束SQL语句参数时遵循以下规则:
1)删除单行SQL语句的“;”或其他特殊字符。
2)在SQL编辑器对话框的顶部使用以下语句:
FME_SQL_DELIMITER
如。
FME_SQL_DELIMITER /
任何字符都可以用作分隔符,通常你想用“;”来分割。有时候,您可能希望输入一个SQL中没有出现的字符,然后将该字符集成到语句中,这样它们就可以精确地控制语句的分割。
例句:
FME_SQL_DELIMITER /声明有多少个数字;开始选择COUNT(*)到状态中有多少;结束;
谢谢你,史蒂夫,但是你为什么要用twice BEGIN呢?
FME_SQL_DELIMITER $DECLARE howmany number:= 0; start SELECT COUNT(*) into howmany FROM tablename;DBMS_OUTPUT.PUT_LINE(多少);EXCEPTION -- exception handlers begin WHEN OTHERS THEN -- handles all other errors DBMS_OUTPUT.PUT_LINE('Some other kind of error occurred.');END;异常处理程序和块在这里结束$
我在“Atrributes to expose”中声明了多少,但是SQL执行器中什么也没有……
嗨@julien,谢谢你的评论!
我想,当这篇文章介绍的时候——相当长的一段时间以前——FME可能处理SQL代码的方式有点不同,但我不能肯定。第二个block没有意义。事实上,这段代码还有另一个问题…
FME_SQL_DELIMTER没有正确设置…(应该是“/”),而“/”在结尾没有出现。
不正确的:
FME_SQL_DELIMITER;开始声明有多少个数字;开始选择COUNT(*)到状态中有多少;结束;终结;
正确的:
FME_SQL_DELIMITER /声明有多少个数字;开始选择COUNT(*)到状态中有多少;结束;
我将对本文进行一些调整来反映这一点。谢谢你指出这一点!
嗨史蒂夫,这是否意味着我们可以从sql creator运行一个plsql块并从数据库返回值。如果是这样,我们可以使用“Atrributes to expose”查看结果。我试图执行一个plsql块从sql造物主和我想从数据库的一些变量回来。它成功地执行了一个plsql块,但是没有找到任何结果。
答案是肯定的,但这有点棘手,你要做的是
注意变量在当前会话中是可见的,这意味着您可以在一个SQLExecuter中设置值,并从另一个SQLExecuter中访问它。同样在FMEServer上,我们可以同时运行多个工作区,它会有自己版本的变量
我现在没有代码例子,但我会看看我是否能创造一些东西
如果需要在Oracle中运行存储过程…
FME_SQL_DELIMITER /BEGIN OWNER.Truncate_Table ('MYFAVORITE_TABLE');END;/
在上面的例子中,DBA不允许通过FME直接执行表truncate语句…但是允许用户调用存储过程来执行相同的操作。也许DBA想要跟踪所有的表截断,并可能记录交易的某些信息,这可以在执行truncate时在存储过程中完成。
©2019安全亚搏在线软件公司法律