探索Oracle中神秘的占位符(oracle 中的占位符)
在Oracle中,我们经常会看到一些神秘的占位符,例如”&”、”:”、”?”等。这些占位符在SQL语句、PL/SQL代码和SQL*Plus命令中都可能出现,而它们的作用似乎总是有些模糊和不清晰。本文将探索这些占位符的意义和使用方法,帮助读者更好地理解和应用Oracle。
一、&与:
在SQL*Plus中,”&”和”:”通常用于提供用户输入的变量值。例如,我们可以这样使用它们:
SELECT ename, sal
FROM empWHERE deptno=&dept_num;
或者:
SELECT ename, sal
FROM empWHERE deptno=:dept_num;
在执行以上语句时,SQL*Plus会提示用户输入一个名为”dept_num”的变量值。用户输入后,该变量值将被替换到SQL语句中,从而实现动态查询的效果。
&和:的区别在于:&会在每次使用时都提示用户输入变量值,而:只会在第一次使用时提示一次,以后不再提示。此外,:可以在PL/SQL块中使用,而&仅限于SQL语句和SQL*Plus命令。
二、?
另一个常见的占位符是”?”。这个占位符用于预编译SQL语句,从而提高执行效率。我们可以这样使用它:
SELECT ename, sal
FROM empWHERE deptno=?;
在使用预编译语句时,我们需要通过Oracle预编译器将SQL语句转换为可执行代码。在执行时,我们需要向该语句绑定一个参数值,从而替换问号占位符。例如:
PreparedStatement stmt = con.prepareStatement("SELECT ename, sal FROM emp WHERE deptno=?");
stmt.setInt(1, 20);ResultSet rs = stmt.executeQuery();
在以上代码中,我们首先使用con.prepareStatement()方法创建了一个PreparedStatement对象,该对象包含了预编译的SQL语句。然后,我们使用stmt.setInt()方法向该语句绑定一个整数类型的参数值20。我们执行了该语句,并将结果存入ResultSet对象rs中。
使用预编译语句的好处是可以提高执行效率。因为预编译器在编译时就已经将语句转换为可执行代码,并进行了优化。而且,使用绑定参数可以避免SQL注入攻击。
三、总结
本文介绍了Oracle中常见的占位符”&”、”:”和”?”,并分别说明了它们的用途和用法。相信读者在日常使用Oracle时,可以更加灵活地运用这些占位符,提高开发效率和安全性。
代码示例:
import java.sql.*;
public class OracleTest { public static void mn(String[] args) throws Exception {
String url = "jdbc:oracle:thin:@localhost:1521:ORCL"; String user = "scott";
String password = "tiger"; Connection con = DriverManager.getConnection(url, user, password);
// 使用&占位符
String sql1 = "SELECT ename, sal FROM emp WHERE deptno=&dept_num"; PreparedStatement stmt1 = con.prepareStatement(sql1);
stmt1.setInt(1, 20); ResultSet rs1 = stmt1.executeQuery();
while (rs1.next()) { System.out.println(rs1.getString("ename") + "\t" + rs1.getDouble("sal"));
}
// 使用:占位符 String sql2 = "SELECT ename, sal FROM emp WHERE deptno=:dept_num";
PreparedStatement stmt2 = con.prepareStatement(sql2); stmt2.setInt("dept_num", 20);
ResultSet rs2 = stmt2.executeQuery(); while (rs2.next()) {
System.out.println(rs2.getString("ename") + "\t" + rs2.getDouble("sal")); }
// 使用?占位符
String sql3 = "SELECT ename, sal FROM emp WHERE deptno=?"; PreparedStatement stmt3 = con.prepareStatement(sql3);
stmt3.setInt(1, 20); ResultSet rs3 = stmt3.executeQuery();
while (rs3.next()) { System.out.println(rs3.getString("ename") + "\t" + rs3.getDouble("sal"));
}
con.close(); }
}