call命令

一、call命令总结

【1】call命令简介

  学过汇编或C的朋友,肯定都知道call指令表示什么意思。其实,在这里它的意思也是一样的。在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。

  语法: call [ [Drive:] [Path] FileName [BatchParameters]] [:label [arguments]]

  参数: [Drive:][Path] FileName  指定要调用的批处理程序的位置和名称。Filename 参数必须是.bat 或 .cmd 扩展名的类型文件。

  BatchParameters 指定批处理程序所需的命令行信息(即参数项)。   

  调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。   

  call 命令接受用作跳转目标的标签。如果在脚本或批处理文件外使用call,它将不会在命令行起作用。

【2】call命令应用

  1. 基本应用。应用示例:新建两个文本文件,一个命名为call1,修改文件的类型为bat,用Notepad++打开编辑内容为:

1 echo running call1

  另一个命名为call2,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off2 echo start3 call call1.bat4 echo running call25 echo end6 pause

  双击执行call2文件,执行结果如下所示:

  过程解析:

  可以很清晰的看到,call调用类似于函数调用的执行逻辑:call2相当于执行主函数,在其执行过程中,需要调用到call1函数,当call1执行结束后,call2主函数再继续执行本身的命令,直至整个过程结束。

  注意:call1脚本第一行没有再写@echo off语句。因为call2第一行已经关闭了命令回显状态,当call2调用call1时,此设置同样有效,由此可更深入理解调用。

  2. 调用标签。应用示例:新建两个文本文件,一个命名为call3,修改文件的类型为bat,用Notepad++打开编辑内容为:

复制代码
1 @echo off2 call :label3 echo 14 echo 25 6 :label7 echo 38 echo 4
复制代码

  另一个命名为call4,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off2 call call3.bat3 pause

  双击执行call4文件,执行结果如下所示:

  过程解析:

  看到这个结果什么感觉?让你想起了什么呢?想不起来啥?一看你若有所茫的样子,就知道你把goto与这个搞混了!请看下文call命令与goto命令的区别。

  3. 调用带参数的批处理。应用示例:新建两个文本文件,一个命名为call7,修改文件的类型为bat,用Notepad++打开编辑内容为:

1 echo %1 %22 echo %3

  另一个命名为call8,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off2 call call7.bat hello world 1233 dir c:\4 pause

  双击执行call8文件,执行结果如下所示:

【3】call命令与goto命令的区别

  call命令的应用示例2中,我们看到了call命令对跳转标签的调用,注意调用时必须在标签名前加冒号,而goto是直接跟标签名。

  关于goto命令不懂的可以参见同系列随笔《批处理命令——goto 和 :》

  同上例,我们再看看goto的执行效果:新建两个文本文件,一个命名为call5,修改文件的类型为bat,用Notepad++打开编辑内容为:

复制代码
1 @echo off2 goto label3 echo 14 echo 25 6 :label7 echo 38 echo 4
复制代码

  另一个命名为call6,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off2 call call5.bat3 pause

  双击执行call6文件,执行结果如下所示:

<think>我们正在讨论Oracle数据库中的CALL命令。根据用户提供的引用,特别是引用[2]和引用[3],我们可以总结CALL命令的作用和用法。首先,引用[2]明确指出:-CALL是SQL命令,可以在任何工具中使用。-使用CALL调用存储过程时,即使没有参数,也必须使用括号。-示例中显示,当使用`callp_test`(没有括号)时,会报错“ORA-06576:不是有效的函数或过程名”;而使用`callp_test()`(带括号)则成功。引用[3]则提供了关于Oracle架构的背景,但未直接涉及CALL命令的细节。引用[1]和引用[4]分别涉及了在Oracle中执行存储过程的两种方式(EXEC和CALL)以及JavaScript中call的用法,但我们需要聚焦于Oracle数据库的CALL命令。因此,我们可以总结如下:###OracleCALL命令的作用CALL命令用于调用存储过程(PROCEDURE)或函数(FUNCTION)[^2]。它是SQL标准的一部分,因此可以在支持SQL的任何工具中使用。###用法1.**调用存储过程**:```sqlCALLprocedure_name([参数列表]);```即使存储过程没有参数,也必须使用括号,例如:```sqlCALLprocedure_without_args();```2.**调用函数**:对于函数,通常使用SELECT语句,但CALL也可以用于调用函数,不过需要注意函数返回值的位置。在Oracle中,使用CALL调用函数时,需要使用绑定变量来接收返回值,例如:```sqlVARIABLEresultNUMBER;CALLmy_function(参数)INTO:result;```但请注意,在Oracle中,更常见的函数调用方式是使用SELECT语句。###与EXEC的区别-**EXEC**:是SQL*Plus特有的命令(实际上是`EXECUTE`的缩写),只能在SQL*Plus中使用。它不需要括号,例如:```sqlEXECprocedure_name;```或者带参数:```sqlEXECprocedure_name(arg1,arg2);```-**CALL**:是标准SQL命令,可以在任何支持SQL的工具(如JDBC、ODBC等)中使用。调用时必须使用括号,即使没有参数。###示例假设有一个存储过程`p_test`,没有参数。-使用CALL调用:```sqlCALLp_test();```-使用EXEC调用(仅在SQL*Plus中):```sqlEXECp_test;```###注意事项1.在调用存储过程时,如果使用CALL,必须确保括号的存在。2.在调用函数时,使用CALL需要配合绑定变量来接收返回值,这通常比直接使用SELECT语句更复杂。3.在Oracle中,存储过程和函数的调用方式有多种,选择哪种取决于具体环境和需求。###引用说明根据提供的引用[2],我们得知了CALL和EXEC的区别以及CALL的用法。§§相关问题§§1.在Oracle中,如何用CALL命令调用带参数的存储过程?2.在Oracle中,CALL命令和直接使用SELECT语句调用函数有何区别?3.在Oracle的存储过程中,如何定义参数并在CALL命令中传递?</think>### Oracle CALL命令详解 #### 核心作用 `CALL`命令是Oracle数据库中用于**执行存储过程/函数的SQL标准命令**,其核心作用包括: 1. **执行存储过程**:调用无返回值的过程 ```sql CALL my_procedure(); ``` 2. **执行函数**:通过绑定变量获取返回值 ```sql VARIABLE result NUMBER; CALL my_function() INTO :result; ``` 3. **跨工具兼容**:作为SQL标准命令可在所有支持SQL的客户端工具中使用[^2] #### 关键特性 | 特性 | CALL | EXEC | |------|------|------| | **标准性** | SQL标准命令 | SQL*Plus特有 | | **括号要求** | 必须带括号(即使无参数) | 无参数时可省略括号 | | **工具支持** | 所有SQL客户端 | 仅SQL*Plus | | **函数支持** | 可通过INTO获取返回值 | 不支持函数调用 | #### 用法示例 1. **调用无参过程** ```sql -- 正确写法 CALL update_employees(); -- 错误写法(缺少括号报错ORA-06576) CALL update_employees; ``` 2. **调用带参过程** ```sql CALL calculate_bonus(employee_id => 101, bonus_rate => 0.15); ``` 3. **调用函数获取返回值** ```sql VARIABLE total_salary NUMBER; CALL get_department_salary(10) INTO :total_salary; PRINT total_salary; ``` #### 注意事项 1. **括号强制规则**:即使过程无参数也必须使用空括号`()`[^2] ```sql -- 有效调用 CALL log_activity(); -- 无效调用(引发ORA-06576) CALL log_activity; ``` 2. **权限要求**:用户需具备过程的`EXECUTE`权限 3. **事务控制**:过程内COMMIT/ROLLBACK会影响当前事务 4. **命名空间**:跨schema调用需指定schema前缀 ```sql CALL hr_schema.calculate_payroll(); ``` #### 与EXEC的区别 - **EXEC**:SQL*Plus特有快捷命令,实质是`BEGIN...END`块的包装 ```sql EXEC my_proc; -- SQL*Plus中有效 ``` - **CALL**:标准SQL命令,可在JDBC/ODBC等接口通用使用[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值