Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Parametermarkörer är namngivna eller namnlösa typade platshållarvariabler som används för att tillhandahålla värden från API:et som anropar SQL-instruktionen.
Med hjälp av parametermarkörer skyddas koden från SQL-inmatningsattacker eftersom den tydligt separerar angivna värden från SQL-uttrycken.
Du kan inte blanda namngivna och namnlösa parametermarkörer i samma SQL-instruktion.
Du får inte referera till en parametermarkör i en DDL-instruktion, till exempel en genererad kolumn eller DEFAULT definition, en vy eller en SQL-funktion.
Undantag är referenser till parametermarkörer i IDENTIFIER-satsen, som kan användas för att parametrisera tabell- eller kolumnnamn i vissa DDL-instruktioner. Se IDENTIFIER-satsen.
Parametermarkörer kan anges av:
- Python med hjälp av API:et pyspark.sql.SparkSession.sql().
- Scala med hjälp av API:et org.apache.spark.sql.SparkSession.sql().
- Java använder sitt org.apache.spark.sql.SparkSession.sql() API.
Namngivna parametermarkörer
gäller för: Databricks Runtime
12.1 och senare
Namngivna parametermarkörer är typindelade platshållarvariabler. API:et som anropar SQL-instruktionen måste ange namn/värde-par för att associera varje parametermarkör med ett värde.
Syntax
:parameter_name
Parametrar
-
En referens till en angiven parametermarkör i form av en okvalificerad identifierare.
Anteckningar
Du kan referera till samma parametermarkör flera gånger inom samma SQL-instruktion. Om inget värde har bundits till parametermarkören utlöses ett UNBOUND_SQL_PARAMETER fel. Du behöver inte referera till alla angivna parametermarkörer.
Det obligatoriska föregående : (kolon) skiljer namnområdet för namngivna parametermarkörer från kolumnnamn och SQL-parametrar.
Exempel
I följande exempel definieras två parametermarkörer:
-
senare: En
INTERVAL HOURmed värdet 3. -
x: En
DOUBLEmed värdet 15,0
x refereras flera gånger, medan later refereras en gång.
SQL
> DECLARE stmtStr = 'SELECT current_timestamp() + :later, :x * :x AS square';
> EXECUTE IMMEDIATE stmtStr USING INTERVAL '3' HOURS AS later, 15.0 AS x;
2024-01-19 16:17:16.692303 225.00
Scala
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("Spark named parameter marker example")
.getOrCreate()
val argMap = Map("later" -> java.time.Duration.ofHours(3), "x" -> 15.0)
spark.sql(
sqlText = "SELECT current_timestamp() + :later, :x * :x AS square",
args = argMap).show()
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// | 2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+
Java
import org.apache.spark.sql.*;
import static java.util.Map.entry;
SparkSession spark = SparkSession
.builder()
.appName("Java Spark named parameter marker example")
.getOrCreate();
Map<String, String> argMap = Map.ofEntries(
entry("later", java.time.Duration.ofHours(3)),
entry("x", 15.0)
);
spark.sql(
sqlText = "SELECT current_timestamp() + :later, :x * :x AS square",
args = argMap).show();
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// | 2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+
Python
spark.sql("SELECT :x * :y * :z AS volume", args = { "x" : 3, "y" : 4, "z" : 5 }).show()
// +------+
// |volume|
// +------+
// | 60|
// +------+
Namnlösa parametermarkörer
Gäller för: Databricks Runtime
13.3 och senare
Namnlösa parametermarkörer är typindelade platshållarvariabler. API:et som anropar SQL-instruktionen måste ange en matris med argument för att associera varje parametermarkör med ett värde i den ordning de visas.
Syntax
?
Parametrar
-
?: En referens till en angiven parametermarkör i form av ett frågetecken.
Anteckningar
Varje förekomst av en namnlös parametermarkör förbrukar ett värde som tillhandahålls av API:et som anropar SQL-instruktionen i ordning. Om inget värde har bundits till parametermarkören utlöses ett UNBOUND_SQL_PARAMETER fel. Du behöver inte använda alla angivna värden.
Exempel
I följande exempel definieras tre parametermarkörer:
- En
INTERVAL HOURmed värdet 3. - Två
DOUBLEmed värdet 15,0 vardera.
Eftersom parametrarna inte är namngivna förbrukas varje angivet värde av högst en parameter.
SQL
> DECLARE stmtStr = 'SELECT current_timestamp() + ?, ? * ? AS square';
> EXECUTE IMMEDIATE stmtStr USING INTERVAL '3' HOURS, 15.0, 15.0;
2024-01-19 16:17:16.692303 225.00
Scala
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("Spark unnamed parameter marker example")
.getOrCreate()
val argArr = Array(java.time.Duration.ofHours(3), 15.0, 15.0)
spark.sql(
sqlText = "SELECT current_timestamp() + ?, ? * ? AS square", args = argArr).show()
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// | 2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+
Java
import org.apache.spark.sql.*;
SparkSession spark = SparkSession
.builder()
.appName("Java Spark unnamed parameter marker example")
.getOrCreate();
Object[] argArr = new Object[] { java.time.Duration.ofHours(3), 15.0, 15.0 }
spark.sql(
sqlText = "SELECT current_timestamp() + ?, ? * ? AS square",
args = argArr).show();
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// | 2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+
Python
spark.sql("SELECT ? * ? * ? AS volume", args = [ 3, 4, 5 ]).show()
// +------+
// |volume|
// +------+
// | 60|
// +------+