我的问题如下: 我正在尝试创建一个将在sqlplus中执行的脚本,这个脚本将做的是我将有一个文件,您可以在每行中写入1个名称。所以我想使用一个关联数组,在其中我将逐行读取文件的内容(每行1个名称)并将每个名称存储在数组中。
我的问题是我无法使用具有现成GET_LINE过程的UTL_FILE包来获取每一行的名称,因为它必须将Oracle的“逻辑目录”作为参数。 我的问题是我无法对数据库进行更改,例如创建新目录或使用in文件的默认目录之一。我必须找到一个解决方案,我将从物理位置读取文件的内容。 我很乐意在两个领域寻求一些帮助。如果你知道任何其他可以在物理位置工作的软件包,或者知道其他任何方式我可以调用sqlplus(sqlplus用户名/传递@myscript)并将其作为参数输入文件或者比如从那里初始化数组。
提前谢谢你。 任何帮助将受到高度赞赏 乔治
答案 0 :(得分:4)
显然,最好的解决方案是使用UTL_FILE或外部表。因此,无法更改数据库是一个主要问题。如果您没有创建目录对象的权限,并且无法说服特权用户代表您这样做,那么您的问题基本上就会变成
“我如何规避对数据库施加的安全限制?”
嗯,有两种可能性。
如果DBA已经不小心在init.ora文件中启用UTL_FILE_DIR参数,您仍然可以使用UTL_FILE,方法是将绝对文件路径传递给FOPEN()。
或者,您可以编写Java存储过程以与OS上的文件进行交互。这需要通过Java安全模型授予权限。 Find out more。同样,你只会在没有询问你是否有松懈的DBA的情况下这样做。
让我说清楚,这些“解决方案”都是灰色的。你真的应该尝试通过适当的渠道获得必要的特权。如果DBA团队不会创建目录,您可以使用它将其升级到您的老板。
答案 1 :(得分:2)
如果您无法对数据库进行任何更改,并且现有数据库无法为您提供所需的权限,那么您就不幸了。
UTL_FILE
要么存在一个Oracle目录对象,该对象指向您具有权限的数据库服务器上的物理目录,或者您正在使用您已通过弃用的访问权限的物理目录UTL_FILE_DIR
参数。您似乎在说这些都不是可行的选择。如果是这种情况,则无法使用UTL_FILE
。
您还可以创建一个从文件中读取数据的外部表。这将要求您可以创建Oracle目录对象和外部表。再一次,听起来你说这不是一个选项,所以外部表格已经出局。
您可以编写一个Java(如果您在Windows上,则为.Net)存储过程,该存储过程将从该文件中读取。这将要求您创建过程并授予所有者必要的文件系统权限。听起来你说这也不是一个选项,所以Java存储过程已经完成了。
如果将文件移动到客户端计算机,则可以使用客户端计算机上的SQL * Loader将数据加载到数据库中的表中。这需要你在数据库中创建一个物理表,但这听起来像你说的那样是不可能的。所以SQL * Loader已经出局了。
如果您可以将文件移动到客户端,您显然可以用您想要读取文件的任何语言编写程序,并构建您想要的任何PL / SQL块。但这对于存储在数据库服务器上的文件不起作用,除非某些非常奇怪的权限授予客户机可以某种方式在服务器上安装目录。
所以我们回到了我们开始的地方。从服务器的操作系统读取文件需要能够读取该文件的权限。你似乎在说你没有也无法获得这些特权。因此,你说你不能做你想做的事。您组织中的任何人要求您实施此更改,都需要与阻止您获得完成工作所需权限的任何人交谈。其中一个需要奠定基础。