我想将变量参数传递给外部 SQL 文件(带有 SQL*Plus 的 PL/SQL)

2023-12-05

我已经在这个论坛和谷歌上搜索了我的问题的答案,但我找不到我的挑战的具体答案。这就是为什么我在这里问这个问题,希望能得到你们其中一个人的答复。

我想使用多个 SQL 文件,而一个 SQL 文件是使用参数执行其他 SQL 文件的控制文件。 该文件名为:startup.sql

我有一个包含所有值的表(不要介意列的名称,我为我的帖子更改了它们)。

create table control (
  S varchar2(15) not null,
  N varchar2(25 char) not null, 
  B varchar2(25 char) not null, 
  Acheck varchar2(25 char) not null, 
  Adcheck varchar2(25) not null, 
  Blu varchar2(25) not null,
  ADB varchar2(25)
)

插入以下内容之一的位置(还有更多条目,但一个足以向您展示工作方式):

    insert into control (S,N,B,Acheck,Adcheck,Blu,ADB)
       values('Test','B','J','J','N','N', '');

我的控制文件如下所示:

set escape on
set serveroutput on
SET DEFINE ON

declare
  cursor c_lees_control is
    select S, N, B, Acheck, Adcheck, Blu, ADB
  from control

  v_s           varchar2(30);
  v_b           varchar2(30);
  v_blu     varchar2(30);

begin

  for r_lees_control in c_lees_control
  loop
    v_s := r_lees_control.S;
    v_b := r_lees_control.B;
    v_blu := r_lees_control.Blu;

    if v_b = 'J' then
      --Also tried this.
      --@C:/Temp/uitvoer.sql $v_s $v_blu
      @C:/Temp/uitvoer.sql %v_s% %v_blu%
end if;
  end loop;
end;
/

在我的 uitvoer.sql 中,我有一个如下变量:

    variable_s := '&&1';
    variable_blu := '&&2';

现在正在发生以下情况。 我启动SQL另外(使​​用我所有的凭据),我启动我的控制文件(control.sql)。 在SQL的输出中另外还说明了以下内容:

old 89:        s = '&&1';
new 89:        s = '%v_s%';
old 128:       b_lu := '&&2';
new 128:       b_lu := '%v_blu%';

我期待以下内容:

old 89:        s = '&&1';
new 89:        s = 'Test';
old 128:       b_lu := '&&2';
new 128:       b_lu := 'J';

为什么控制文件中的变量没有正确解析到新的 SQL 文件中?

我还发现了以下帖子:如何在 sqlplus 中使用 START 将参数传递给 sql 文件中的 PL/SQL 块? / 从批处理文件启动 PL/SQL 脚本(带参数)这看起来像是我的挑战,但我不是从批处理文件调用,而是从 sql 文件调用。

我希望有一个人可以帮助我。如果有什么不清楚,我可以尝试进一步解释。


@ is a SQL*Plus 命令,它在 PL/SQL 中没有任何意义。您的脚本在解析时包含在 PL/SQL 块中,您可以看到list缓冲区中的代码。控制块中声明的变量可直接供“包含”代码使用,无需替换。

举个例子,如果uitvoer.sql仅包含:

dbms_output.put_line(v_s);

然后这个控制脚本:

set serveroutput on
declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql
end;
/

list

生产:

Test

PL/SQL procedure successfully completed.

  1  declare
  2    v_s varchar2(10) := 'Test';
  3  begin
  4  dbms_output.put_line(v_s);
  5* end;

缓冲区中的 PL/SQL 块包含包含的代码,not参考uitvoer.sql。但包含的代码有效,因为它引用了控制脚本中仍在范围内的变量。


如果你想允许控制变量具有不同的名称,允许uitvoer.sql也许要更灵活地调用,那么您仍然可以使用替换变量,但您仍然替换变量名称,而不是其值。例如,用这个uitvoer.sql(请注意,替换变量赋值不会not周围有引号):

declare
  variable_s varchar2(10);
begin
  variable_s := &&1;
  dbms_output.put_line(variable_s);
end;

并且您的控制脚本传递变量名称:

declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql v_s
end;
/

You see:

old   7:   variable_s := &&1;
new   7:   variable_s := v_s;
Test

PL/SQL procedure successfully completed.

  1  declare
  2    v_s varchar2(10) := 'Test';
  3  begin
  4  declare
  5    variable_s varchar2(10);
  6  begin
  7    variable_s := &&1;
  8    dbms_output.put_line(variable_s);
  9  end;
 10* end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我想将变量参数传递给外部 SQL 文件(带有 SQL*Plus 的 PL/SQL) 的相关文章

  • Oracle SQL-根据记录的日期与历史记录标记记录

    这是我在论坛上的第一篇文章 通常我能够找到我需要的东西 但说实话 我不太确定如何针对该问题提出正确的问题 因此 如果论坛上已经有答案而我错过了 请接受我的歉意 我通过 Benthic Software 在 Oracle 数据库中运行以下代码
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3
  • C# 中的 Oracle 连接 - 连接字符串

    我目前正在尝试用 C 构建一个应用程序并将其连接到在 Oracle 11g 中运行的实时数据库 我有以下连接详细信息 Host IP 10 204 1 3 Port 1521 DB Name PROD 我的源代码 string connSt
  • 如何插入包含“&”的字符串

    如何编写包含 字符的插入语句 例如 如果我想将 J J Construction 插入数据库的列中 我不确定这是否有什么不同 但我正在使用 Oracle 9i 我总是忘记这一点 然后又回到它 我认为最好的答案是迄今为止提供的答复的组合 首先
  • 查询以查找平均加权价格

    我在 Oracle 中有一个表 每个给定部分包含多行 每行都有一个与其关联的数量和价格 还有一个给定零件的行集相加的总数量 以下是数据示例 我需要的是获得该零件的平均加权价格 例如 如果数量为 100 的零件的价格为 1 数量为 50 的零
  • 仅使用 SQL 进行 Base 36 到 Base 10 的转换

    出现了一种情况 我需要在 SQL 语句的上下文中执行以 36 为基数到以 10 为基数的转换 Oracle 9 或 Oracle 10 中似乎没有内置任何内容来解决此类问题 我的 Google Fu 和 AskTom 建议创建一个 pl s
  • 在 SQL 中搜索 XML 列

    我有一个 XML 文档来存储 Oracle 数据库中的记录 表 CourseXML 将包含 Record Number int XML Type int XMLDoc clob etc 我想通过 XML 标签在 XMLDoc 列中进行搜索
  • 跨数据库管理系统检查字符串是否为数字的方法

    好的 我有这个字段 code varchar 255 它包含我们导出例程中使用的一些值 例如 DB84 DB34 3567 3568 我需要仅选择自动生成的 全数字 字段 WHERE is numeric table code is num
  • Oracle 时间戳数据类型

    不带参数的时间戳数据类型和带参数 0 的时间戳数据类型有什么不同 timestamp VS timestamp 0 括号中的数字指定要存储的小数秒的精度 所以 0 意味着不存储任何一小部分秒 而仅使用整秒 如果未指定 则默认值为小数点分隔符
  • Oracle 奇怪的 SUM 行为

    我有两个查询 据我了解 这两个查询应该提供相同的结果 但事实并非如此 显然我在这里遗漏了一些重要的观点 我希望你能帮助我 查询 我认为这是错误的 SELECT SUM a amount AS A SUM 10 727 470 FROM bi
  • 如何捕获 PL/SQL 块中的唯一约束错误?

    假设我有一个 Oracle PL SQL 块 它将一条记录插入表中 并且需要从唯一约束错误中恢复 如下所示 begin insert into some table some values exception when update som
  • 浏览多个字段的值并将它们插入到同一列中

    我正在尝试使用重复行为我的 oracle apex 应用程序创建一个功能 假设我有一个车辆表 CREATE TABLE vehicles brand VARCHAR2 50 model VARCHAR2 50 comment VARCHAR
  • Oracle Developer Tools for Visual Studio 2019 无法正确安装

    在 VS 2019 中 ODT 使用扩展名安装 而不是像以前的版本那样作为安装文件安装 因此 从 VS 2017 升级的 EF 6 使用的 MVC 项目 edmx 文件在扩展安装后不显示数据库图表 空白黑页 编辑 xml 选项等 仅此而已
  • 运行 Sqoop 导入和导出时如何找到最佳映射器数量?

    我正在使用 Sqoop 版本 1 4 2 和 Oracle 数据库 运行 Sqoop 命令时 例如这样 sqoop import fs
  • DBMS_SCHEDULER.DROP_JOB 仅当存在时

    我有一个 sql 脚本 在导入转储后必须运行该脚本 该脚本除了执行其他操作外 还执行以下操作 BEGIN remove program SYS DBMS SCHEDULER DROP PROGRAM program name gt STAT
  • Oracle中如何选择前100行?

    我的要求是获取每个客户的最新订单 然后获取前100条记录 我编写了一个如下查询来获取每个客户的最新订单 内部查询工作正常 但我不知道如何根据结果获得前 100 名 SELECT FROM SELECT id client id ROW NU
  • 如何在Oracle中将“(Ab56.12345)some_string”的一个字符串列拆分为两列“Ab.12345”,“some_string”

    正如问题一样 如何拆分一个字符串列 Ab56 12345 some string到两列Ab56 12345and some string在甲骨文中 注意 并非所有列都 Ab56 12345 some string 部分列仅some stri
  • 如何在oracle中获取表作为输出参数

    我正在尝试将 Oracle 过程调用的 out 参数强制转换为对象 它不起作用 因为 据我了解 我需要定义一个映射 它告诉方法如何转换它 如果地图为空或未正确填充 则它默认为 STRUCT 类型的对象 在我的情况下这是错误的 我已经构建了一
  • oracle to_date 转换显示文字与字符串格式不匹配

    如果我使用 unixtime 转换器 我会得到 2005 年 5 月 31 日星期二 16 23 17 GMT 1117556597 如果我运行以下查询 则会收到错误 文字与字符串格式不匹配 这是为什么 select to date 111
  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小

随机推荐

  • PHP - uniqid("",true) 与 uniqid("")+mt_rand()

    这两种生成连续但有些唯一的数字的方法之间的主要区别是什么 我想使用这样的数字作为 MySQL 数据库内的唯一用户 ID 也作为盐来加盐密码 我的理解是 出于聚类和索引的原因 这些 ID 应该是连续的 我意识到在某些情况下 随机字符串将使同一
  • VS2013“v120_xp”默认为平台工具集

    为了在Windows XP下部署使用VS2013编译器构建的C 应用程序 必须设置 v120 xp 平台工具集 这使得从XP到8 1的部署成为可能 那么接下来的问题是 为什么这个平台工具集不是唯一的 默认的 v120 平台工具集适用于从 W
  • HTML 画布在调整大小后更新次数过多

    我有一个画布 可以在其中制作动画 我监听窗口调整大小事件 更新画布大小并再次开始递归绘图 但旧的 draw 调用似乎仍在继续 这导致动画比预期的速度更快 这是代码 HTML
  • onIceCandidate 在 setRemoteDescription 之后永远不会调用 - webrtc - Android

    我按照一些流程解释了如何在 webrtc 中进行连接 但我被阻止了 获得 sdpOffer 后 我想调用 setRemoteDescription 并且有一个 onIceCandidate 回调 但我没有这个回调 如果您需要 我可以展示我的
  • Matter.js 物理引擎的结果总是不同

    我在 Matter js 物理引擎中创建了一个简单的动画 其中有一些物体碰撞并掉落在地上 我注意到结果总是有点不同 你可以在这里看到 https jsfiddle net 95urgeqf 1 var Engine Matter Engin
  • 如何使用Python连接来自不同元组但在同一索引中的两个字符串?

    文件内的元组 Wanna O be O like O Alexander B Coughan I O 我的问题是 如何使用条件连接来自不同元组但位于同一索引中的两个字符串 例如 在我的例子中 如果 1 等于 B 并后跟 I 我想在 0 中加
  • Angular 和 Spring Boot:配置使它们高效地协同工作

    Angular 项目构建依赖于角度 CLI 工具 Spring Boot项目构建依赖于Spring Boot Maven 插件 那么如何配置和构建一个在前端托管 Angular 应用程序的 Spring Boot 应用程序呢 我的要求如下
  • 在 Haml 中保留属性顺序

    如果我在 HAML 中创建一个 XML 元素 tag b gt b a gt a 我得到这个输出
  • 如何通过chrome api设置下载位置

    我正在使用 chrome experimental downloads download 来下载网址 但无法设置下载位置 所有的url都下载到chrome的默认位置 我已经厌倦了 url xxxxxxxxxx filename file p
  • Magento 多商店多货币

    我有 2 家商店 其中 1 家卖 2 美元加元 我的第一家商店工作正常 当我发送到贝宝时 我的第二家商店显示产品价值加元 当时加元价值转换为美元 你能建议我如何解决我需要的它 当贝宝显示加元时 这个问题的解决办法在于这个 Magento 线
  • C++ 如何使用 ESC 按钮终止我的程序

    这是我的主要功能 我使用 Visual Studio 2012 Express 代码工作正常 我的问题是 当用户按下 ESC 按钮而不是 1 时 我将如何终止此循环 虽然我更喜欢在 UNIX 和 Windows 上都可以使用的解决方案 但如
  • 编辑视图中多选列表框的超级简单实现

    此处使用 MVC4 与 EF 和 CF 糟糕 我有一堂这样的课 public class Feature public int ID get set public string Desc get set 还有这样的一个 public cla
  • GetAdaptersInfo 和 GetAdaptersAddressess BufferLength 参数

    我这里有一些 C 遗留代码 它们做了一些我不明白的事情 我在运行 Windows XP 的计算机上以 Visual C 2008 Express Edition 运行它 该代码使用了一些 Windows 函数 获取适配器信息和获取适配器地址
  • 在 jsfiddle 上看不到代码,只有结果[关闭]

    Closed 这个问题是无关 目前不接受答案 我一直在看 jsfiddle 在其他问题上发布的内容 但由于某种原因我只能看到结果而不是代码 起初这似乎是随机发生的 但现在看起来相当一致 JSfiddle 如何在没有任何代码的情况下渲染结果
  • 在phonegap应用程序中显示pdf

    如何在中显示在线 PDFMy Phonegap App 我在尝试iframe但是PDF不显示还有其他解决办法吗 我想在我的应用程序中显示来自 URL 的 PDF 而不是在默认 PDF 查看器中显示 提前致谢 您可以使用 Google PDF
  • 从 .NET Windows 应用程序中运行 powershell 脚本

    我需要从 vb net windows 应用程序中运行脚本 我的脚本在后台运行得很好 Using MyRunSpace As Runspace RunspaceFactory CreateRunspace MyRunSpace Open U
  • guice 与提供商的多重绑定

    我试图在我的代码中包含此内容 Inject private Map
  • Python 命令行 -x 选项

    我最近看到 python 将 x 作为命令行选项 它的作用是在此处的文档中解释的 python x Skip the first line of the source allowing use of non Unix forms of cm
  • Hudson svn 凭证

    如何通过 shell 在 Hudson 中输入 subversion 凭据 我尝试在 HUDSON HOME 中生成文件 hudson scm SubversionSCM xml 并重新加载配置 但未应用更改 从 shell 输入凭据的最简
  • 我想将变量参数传递给外部 SQL 文件(带有 SQL*Plus 的 PL/SQL)

    我已经在这个论坛和谷歌上搜索了我的问题的答案 但我找不到我的挑战的具体答案 这就是为什么我在这里问这个问题 希望能得到你们其中一个人的答复 我想使用多个 SQL 文件 而一个 SQL 文件是使用参数执行其他 SQL 文件的控制文件 该文件名