Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
gäller för:
Databricks SQL
Databricks Runtime
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 skyddar du koden från SQL-inmatningsattacker eftersom den tydligt separerar angivna värden från strukturen för SQL-uttrycken.
Du kan inte blanda namngivna och namnlösa parametermarkörer i samma SQL-instruktion.
Du kan också använda parametermarkörer i IDENTIFIER -satsen, som kan användas för att parametrisera objektnamn. 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.
Följande regler gäller:
Gäller för:
Databricks SQL
Databricks Runtime 17.3 LTS och tidigare- Du kan referera till en parametermarkör i ett uttryck
- Du får inte referera till en parametermarkör i en DDL-instruktion, till exempel en genererad kolumn eller
DEFAULTdefinition, en vy eller en SQL-funktion. Undantag är referenser till parametermarkörer iIDENTIFIER-satsen, som kan användas för att parametrisera ämnet för vissa DDL-instruktioner. Se IDENTIFIER-satsen.
Gäller för:
Databricks Runtime 18.0 och senare- Du kan referera till en parametermarkör där du kan använda en literal av parametermarkörens typ.
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|
// +------+
Gäller för: Databricks Runtime
18.0 och senare
> EXECUTE IMMEDIATE 'SELECT 1::DECIMAL(:precision, :scale)' USING 6 AS precision, 4 AS scale;
1.0000
> EXECUTE IMMEDIATE 'CREATE VIEW v(c1 INT) AS SELECT :val AS c1' USING 10 AS val;
> SELECT * FROM v;
10
> EXECUTE IMMEDIATE 'CREATE TABLE T(c1 INT DEFAULT :def COMMENT \'This is a \' :com)' USING 17 AS def, 'comment' as com;
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|
// +------+
Gäller för: Databricks Runtime
18.0 och senare
> EXECUTE IMMEDIATE 'SELECT 1::DECIMAL(?, ?)' USING 6, 4;
1.0000
> EXECUTE IMMEDIATE 'CREATE VIEW v(c1 INT) AS SELECT ? AS c1' USING 10;
> SELECT * FROM v;
10
> EXECUTE IMMEDIATE 'CREATE TABLE T(c1 INT DEFAULT ? COMMENT \'This is a \' ?)' USING 17 AS def, ? as com;