fetch()函数

本文探讨了如何使用Rails框架中的fetch方法来处理HTTP请求参数,并确保应用程序的安全性。通过实例介绍了如何为参数设置默认值,以及如何使用Strong Parameters API来限制可以接受的参数,避免潜在的安全风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你可能还想在 new 动作中限制允许传入的属性。不过此时无法再根键上调用 require 方法,因为此时根键还不存在:

using fetch you can supply a default and use

the Strong Parameters API from there.

params.fetch(:blog, {}).permit(:title, :author)

fetch(key, *args)Link
Returns a parameter for the given key. If the key can’t be found, there are several options: With no other arguments, it will raise anActionController::ParameterMissing error; if more arguments are given, then that will be returned; if a block is given, then that will be run and its result returned.

params = ActionController::Parameters.new(person: { name: ‘Francesco’ })
params.fetch(:person) # => {“name”=>”Francesco”}
params.fetch(:none) # => ActionController::ParameterMissing: param not found: none
params.fetch(:none, ‘Francesco’) # => “Francesco”
params.fetch(:none) { ‘Francesco’ } # => “Francesco”

fetch(name, options = nil)Link
Fetches data from the cache, using the given key. If there is data in the cache with the given key, then that data is returned.

If there is no such data in the cache (a cache miss), then nil will be returned. However, if a block has been passed, that block will be passed the key and executed in the event of a cache miss. The return value of the block will be written to the cache under the given cache key, and that return value will be returned.

cache.write(‘today’, ‘Monday’)
cache.fetch(‘today’) # => “Monday”

cache.fetch(‘city’) # => nil
cache.fetch(‘city’) do
‘Duckburgh’
end
cache.fetch(‘city’) # => “Duckburgh”

fetch(key, *extras)Link
Same as Hash#fetch where the key passed as argument can be either a string or a symbol:

counters = ActiveSupport::HashWithIndifferentAccess.new
counters[:foo] = 1

counters.fetch(‘foo’) # => 1
counters.fetch(:bar, 0) # => 0
counters.fetch(:bar) { |key| 0 } # => 0
counters.fetch(:zoo) # => KeyError: key not found: “zoo”

<think>首先,用户的问题是:“我想了解Oracle数据库中FETCH函数的用法和功能请问OracleFETCH函数使用方法和示例”。这是一个关于Oracle数据库的FETCH函数的问题。从系统指令中,我需要:-使用$...$格式表示行内数学表达式(但在这个上下文中,可能不涉及数学表达式)。-独立公式用$$...$$格式(同样,可能不适用)。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在引用的段落末尾添加引用标识,例如[^1]。-回答结构清晰,帮助用户逐步解决问题。-参考站内引用:用户提供了几个引用:-[^1]:关于SQL游标的@@FETCH_STATUS函数。-[^2]:OracleFetch子句的示例。-[^3]:使用FETCHFIRST...ROWSWITHTIES的示例。用户的问题是针对Oracle的FETCH函数。在Oracle中,FETCH不是函数,而是SQL语句的一部分,用于检索游标中的数据。用户可能误解了,或者指的是FETCH子句,如引用中提到的。回顾引用:-[^1]讨论的是SQLServer的@@FETCH_STATUS函数,不是Oracle的。这可能是混淆。-[^2]和[^3]是关于Oracle的FETCH子句的示例。在Oracle中,FETCH通常与游标相关。在PL/SQL中,FETCH用于从显式游标中检索行。在SQL中,Oracle12c引入了FETCHFIRST子句用于限制查询返回的行数。用户说“FETCH函数”,但FETCH在Oracle中不是函数;它是语句或子句。我需要澄清这一点。我的回答应该:1.澄清概念:FETCH在Oracle中不是函数,而是用于游标操作的语句或SQL查询中的子句。2.解释用法:-在PL/SQL中:FETCH用于从显式游标中获取数据。-在SQL中:FETCHFIRST用于限制结果集的行数(从Oracle12c开始)。3.提供示例:基于引用[^2]和[^3],给出示例代码。4.结构清晰:逐步解释。5.添加引用标识:在引用段落末尾添加[^1],[^2],[^3]。6.生成相关问题:在回答结束时生成相关问题。回答结构:-介绍FETCH在Oracle中的概念。-解释两种主要用法:PL/SQL中的FETCH语句和SQL中的FETCHFIRST子句。-提供示例代码。-总结。-生成相关问题。使用中文回答。生成相关问题:基于主题,如:1.FETCH在PL/SQL中的高级用法?2.如何优化使用FETCHFIRST的查询?3.FETCH与其他数据库的类似功能的比较?确保回答真实可靠:基于Oracle文档知识。FETCH在PL/SQL中用于游标,FETCHFIRST在SQL中用于行限制。参考用户提供的引用:-[^2]展示了在Oracle中使用ROWNUM的旧方法(FETCHFIRST之前的)。-[^3]展示了FETCHFIRST...WITHTIES的示例。在我的回答中,我会引用这些。最终输出格式:-回答部分。-§§相关问题§§部分。</think>### Oracle FETCH 用法详解 在 Oracle 数据库中,"FETCH" 不是独立的函数,而是用于操作游标或限制查询结果集的语句或子句。它主要用于从显式游标中检索数据(在 PL/SQL 中),或在 SQL 查询中限制返回的行数(从 Oracle 12c 开始引入)。下面我将逐步解释其用法、功能、语法和示例,确保内容基于 Oracle 官方文档和最佳实践。 #### 1. **FETCH 的基本概念** - **在 PL/SQL 中**:FETCH 是游标操作的一部分。游标是一个指针,用于遍历查询结果集。FETCH 语句用于从显式游标中检索一行或多行数据。 - 语法:`FETCH cursor_name INTO variable_list;` - 功能:结合 OPEN、FETCH 和 CLOSE 命令,实现数据的逐行处理。 - **在 SQL 中**:从 Oracle 12c 起,引入了 `FETCH FIRST` 子句(替代旧版 `ROWNUM`),用于限制查询返回的行数。 - 语法:`SELECT ... ORDER BY ... FETCH FIRST n ROWS ONLY;` 或 `FETCH FIRST n ROWS WITH TIES;` - 功能:高效地获取前 N 行结果,常用于分页或 top-N 查询。 - 关键点:FETCH 不是函数,因此没有返回值;它是一个操作指令。Oracle 中支持游标的系统函数如 `@@FETCH_STATUS` 是 SQL Server 特有的,不适用于 Oracle[^1]。 #### 2. **FETCH 的使用方法** - **在 PL/SQL 中(游标操作)**: - 步骤: 1. 声明游标:`CURSOR cursor_name IS SELECT ...` 2. 打开游标:`OPEN cursor_name;` 3. 使用 FETCH 检索数据:`FETCH cursor_name INTO variable1, variable2, ...;` 4. 处理数据(如循环遍历)。 5. 关闭游标:`CLOSE cursor_name;` - 示例:从 employees 表中检索前 5 名员工的 ID 和姓名。 ```sql DECLARE CURSOR emp_cursor IS SELECT employee_id, first_name FROM employees ORDER BY salary DESC; v_emp_id employees.employee_id%TYPE; v_first_name employees.first_name%TYPE; BEGIN OPEN emp_cursor; FOR i IN 1..5 LOOP FETCH emp_cursor INTO v_emp_id, v_first_name; EXIT WHEN emp_cursor%NOTFOUND; -- 检查是否无更多数据 DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_first_name); END LOOP; CLOSE emp_cursor; END; ``` - 说明:`FETCH` 将数据存入变量,`%NOTFOUND` 属性用于检测游标结束。 - **在 SQL 中(行限制子句)**: - 语法变体: - `FETCH FIRST n ROWS ONLY`:严格获取前 N 行。 - `FETCH FIRST n ROWS WITH TIES`:获取前 N 行,如果最后一行有相同值,则包含所有并列行。 - 可结合 `OFFSET` 实现分页:`OFFSET m ROWS FETCH NEXT n ROWS ONLY;` - 示例:获取工资最高的前 2 名员工,包括并列者。 ```sql SELECT employee_id, first_name, last_name, salary FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES; ``` 输出类似: ``` EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY ----------- ---------- ---------- ---------- 100 Steven King 24000 101 Neena Kochhar 17000 102 Lex De Haan 17000 ``` 此示例中,`WITH TIES` 确保了工资为 17000 的所有员工都被包含[^3]。 - 旧版 Oracle(11g 及以下)替代方案:使用 `ROWNUM` 和子查询,例如: ```sql SELECT product_name, quantity FROM inventories INNER JOIN products USING(product_id) WHERE ROWNUM <= 5 ORDER BY quantity DESC; ``` 这等效于 `FETCH FIRST 5 ROWS ONLY`,但效率较低[^2]。 #### 3. **功能优势与注意事项** - **优点**: - **性能高效**:`FETCH FIRST` 在 Oracle 12c+ 中优化了执行计划,比 `ROWNUM` 更节省资源。 - **灵活性**:`WITH TIES` 处理并列值,适用于排行榜或分页场景。 - **简化代码**:在 PL/SQL 中,FETCH 简化了数据遍历。 - **注意事项**: - 在 PL/SQL 中,FETCH 必须与显式游标配合;隐式游标(如 FOR 循环)自动处理 FETCH。 - `FETCH FIRST` 必须与 `ORDER BY` 一起使用,否则结果无序。 - 游标操作需管理资源:确保关闭游标避免内存泄漏。 - 兼容性:`FETCH FIRST` 仅适用于 Oracle 12c 及以上版本;旧版需用 `ROWNUM`[^2][^3]。 #### 4. **总结** FETCH 在 Oracle 中主要用于: - PL/SQL 游标:逐行检索数据。 - SQL 查询:高效限制结果集行数。 通过合理使用,可提升查询性能和代码可读性。实际应用中,推荐优先使用 `FETCH FIRST` 子句进行行限制,并在 PL/SQL 中结合游标属性(如 `%NOTFOUND`)处理边界条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值